- ベストアンサー
サイコロの目を出す計算について疑問
よろしくお願いします。 VB6.0でサイコロの目1-6を出す計算式として、 Int(Rnd() * 6) + 1 というものをよく見かけますが、これだと均等に1-6が出現しないような気がします。 Rnd()は0-1の値を返して、その値は全くランダムに返されるのだから、 戻り値が0<=かつ<0.1の場合はサイコロの目は1となり 0.1<=かつ<0.2ならサイコロの目は1となり 戻り値が0.2<=かつ<0.3なら目は2 0.3<=かつ<0.4なら2 戻り値が0.4<=かつ<0.5なら目は3 それなら次の、戻り値が0.5<=かつ<0.6なら目は3かと思えば、そうでなく4になってしまいます。 以下、 戻り値0.6台なら目は4 戻り値0.7台なら目は5 戻り値0.8台なら目は5 戻り値0.9台なら目は6 となり、これではぜんぜん均等にばらけないではないか?と思ったのですが、 実際に100000回計算させてそれぞれの出現回数を調べるとほぼ均等にばらけて いるように見えます。 一体どうしてなのでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
まず、Rnd()は0.000000・・・から0.999999・・・の範囲です。 これを6倍すると0.00000000から5.99999999になります。 1を足して1.00000000から6.9999999ですね。 従って 1.0000000から1.9999999が1 2.0000000から2.9999999が2 同様に 6.0000000から6.9999999が6 ということになります。
その他の回答 (3)
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
Rnd()関数は不定値を返すだけの関数です。 >Int(Rnd() * 6) + 1 >というものをよく見かけますが、これだと均等に1-6が出現しないような気がします。 乱数からでは確立を求めることは不可能です。 統計は「振った回数」と「出目」による比率です。 確立は「全パターン」と「出目パターン」による比率です。 最近、サイコロ関係でアドバイスをしたことがあるので、そちらを参考にどうぞ。 http://okweb.jp/kotaeru.php3?q=1673395 [サイコロの出る目の確立をプログラムで出すには??] >実際に100000回計算させてそれぞれの出現回数を調べるとほぼ均等にばらけているように見えます。 もし、バラバラにならなければ、Rnd()関数の意味が無くなってしまいますよ^^;;;;
お礼
な、なるほど。今まで統計と確率の違いなんて考えても見ませんでした。 リンク先のサンプル、ちょっと理解するのに時間を要しそうですが、 なんとかがんばってみます。 どうもありがとうございました。
- kamejiro
- ベストアンサー率28% (136/479)
Rnd()は0-1の値を返すのなら、 Rnd() * 6の計算は、0-6を返します。 よって、 Int(Rnd() * 6) + 1は1-6の整数を一様に返すことになります。 言い換えると、 0<= 戻り値 <0.166666667 なら、目は 1 0.166666667<= 戻り値 <0.333333333 なら、目は 2 0.333333333<= 戻り値 <0.5 なら、目は 3 0.5<= 戻り値 <0.666666667 なら、目は 4 0.666666667<= 戻り値 <0.833333333 なら、目は 5 0.833333333<= 戻り値 <1 なら、目は 6 になります。
お礼
>Rnd()は0-1の値を返すのなら、 >Rnd() * 6の計算は、0-6を返します。 なるほど、こう考えれば計算する必要もありませんでした。 ありがとうございました。
- shinkun0114
- ベストアンサー率44% (1553/3474)
区切り方を0.1で切るとそのように見えますが、 実際は0.1ごとの乱数を発生するわけではなく、 もっと桁数の多い乱数が出ます。 >戻り値0.6台なら目は4 本当にそうですか? 0.67を超えれば、目は5になりますよ。 0~0.166666 目が1 ~0.333333 目が2 ~0.5 目が3 ~0.666667 目が4 ~0.833333 目が5 ~0.999999 目が6 いずれも幅は0.133333・・です。 おかしくありません。
お礼
は、恥ずかしいです。とんでもない勘違いでした。 諭していただきありがとうございます。
補足
すみません。 >いずれも幅は というところは間違いですよね?
お礼
ありがとうございます。ともてわかりやすく、すっきりしました。