質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

4回答

1381閲覧

Ruby を用いてソシャゲ10連ガチャシミュレータを作りたいです

amune__

総合スコア5

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

2クリップ

投稿2019/08/19 04:12

編集2019/08/19 04:17

Ruby 学習歴1週間程度の超初心者です。
分からないことがありましたので質問させてください。

前提・実現したいこと

Ruby を用いてソシャゲによくある重み付きの抽選プログラムを書きたいと考えております。
例えば SSR の出現率が1%、 SR であれば5%、 N であれば94%といったかんじです。

発生している問題・エラーメッセージ

抽選を行うに当たり Sample メソッドを使用すれば要素のランダム抽選ができるということまではわかったのですが、複数の要素を跨ぎ、かつ重みをつけるという方法がわかりません。

該当のソースコード

Ruby

1#排出率1% 2SSR = ["★4A","★4B","★4C"] 3#排出率5% 4SR = ["★3A","★3B","★3C"] 5#排出率94% 6N = ["★2A","★2B","★2C"] 7 8puts SSR.sample(10) 9

これだと SSR のみの10連ガチャになってしまいますよね・・・

試したこと

上記の通りプログラムを組んだところで、どうすればいいのかわからなくなってしまっています。
お手数をおかけいたしますが、ご回答をよろしくお願いいたします・・・。

補足情報(FW/ツールのバージョンなど)

Rubyのバージョンは 2.6.3 です

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

基本的なことから。

ガチャうんぬんは、初回実行し次に別の結果を求めだすのに
乱数を使用しています。

乱数を使わなければ常に同じ結果となりますよね?
RPG のゲームもそうですが 必ず1歩、歩いたら敵に遭遇する。
なんてお話にならないですよね。(値が固定)

常に違う結果を求められる様にする為に乱数をつかいます。
RAND関数 大抵の言語には標準関数として実装されています。
乱数に与える引数も当たり前ですが、常に変化する変数を用います。
じやないと、同じ結果が帰ってくるからです。
二度と被らない引数としてよく使われるのが、西暦の日付時刻です。

そのランダムに値が帰ってくる性質を使用して
確率x%でhogehogeするという部分をプログラマは
コーディングするのです。
確率もx%の確率としてしまうと、まぐれ当たりの1発あたりが
でにくいので、確率にも遊びを持たせます。
このあたりは、確率について学習してみてください。

やりたいことを実現するために、まずは、いきなりガチャの
ようなややこしいところからではなく、2つのサイコロを用いて
1 と 1 のゾロ目を確率7%でだすプログラムを練習されるとよいかと思います。
普通に考えれば2つのサイコロの確率は1/36です。そこを7%の確率にするにはと考えて
設計すると、やりたいことが見えてくると思います。

投稿2019/08/19 04:55

nanami12

総合スコア1015

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

「SSR の出現率が1%、 SR であれば5%、 N であれば94%」
というのであれば、rand(100)で0~99の範囲のランダムな数値を一つ取得して、
0ならSSR、1~5ならSR、6以上ならN というふう選ぶと、SSRが1%、SRが5%、Nが94%の割合で得られます。

SSRが選ばれたなら、SSR.sample で["★4A","★4B","★4C"]からランダムに一つが得られます。

投稿2019/08/19 04:38

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

配列をつなぎあ合わせるには以下でできます。
SSR = [1, 2, 3]
SR = [10, 100]

SSR.push(SR)
SSR.flatten!
p SSR
//[1, 2, 3, 10, 100]

SSR.flatten!を付けなければ以下になります。
//[1, 2, 3, [10, 100]]

しかしこれでは出現率の問題が解決できておりません。
愚直に
["★4A","★4B","★4C"]["★3A","★3B","★3C","★3A","★3B","★3C","★3A","★3B","★3C","★3A","★3B","★3C","★3A","★3B","★3C"]
["★2A","★2B","★2C"・・・]の様に確率分母数を増やすと、一応想定通りに動くと思います。、、、

投稿2019/08/19 04:32

tonosam

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

tonosam様、coco_bauer様、ありがとうございます!

配列のつなぎ合わせ、rand関数などまだまだ勉強不足だと思いました。

またnanami12様は学習の方針についてもアドバイスくださりありがとうございました!
ガチャシステムを作るには自分の力量不足だということがよくわかりました。。。

がんばって一日でもはやくRubyを習得したいと思います!

本当にありがとうございました

投稿2019/08/19 05:00

amune__

総合スコア5

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問