• ベストアンサー

サイコロの目を出す計算について疑問

よろしくお願いします。 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回計算させてそれぞれの出現回数を調べるとほぼ均等にばらけて いるように見えます。 一体どうしてなのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.1

まず、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 ということになります。

tochanx
質問者

お礼

ありがとうございます。ともてわかりやすく、すっきりしました。

その他の回答 (3)

回答No.4

Rnd()関数は不定値を返すだけの関数です。 >Int(Rnd() * 6) + 1 >というものをよく見かけますが、これだと均等に1-6が出現しないような気がします。 乱数からでは確立を求めることは不可能です。 統計は「振った回数」と「出目」による比率です。 確立は「全パターン」と「出目パターン」による比率です。 最近、サイコロ関係でアドバイスをしたことがあるので、そちらを参考にどうぞ。 http://okweb.jp/kotaeru.php3?q=1673395 [サイコロの出る目の確立をプログラムで出すには??] >実際に100000回計算させてそれぞれの出現回数を調べるとほぼ均等にばらけているように見えます。 もし、バラバラにならなければ、Rnd()関数の意味が無くなってしまいますよ^^;;;;

tochanx
質問者

お礼

な、なるほど。今まで統計と確率の違いなんて考えても見ませんでした。 リンク先のサンプル、ちょっと理解するのに時間を要しそうですが、 なんとかがんばってみます。 どうもありがとうございました。

  • kamejiro
  • ベストアンサー率28% (136/479)
回答No.3

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 になります。

tochanx
質問者

お礼

>Rnd()は0-1の値を返すのなら、 >Rnd() * 6の計算は、0-6を返します。 なるほど、こう考えれば計算する必要もありませんでした。 ありがとうございました。

回答No.2

 区切り方を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・・です。 おかしくありません。

tochanx
質問者

お礼

は、恥ずかしいです。とんでもない勘違いでした。 諭していただきありがとうございます。

tochanx
質問者

補足

すみません。 >いずれも幅は というところは間違いですよね?

関連するQ&A

  • サイコロの確立

    六面体のサイコロを3回振って、目の合計が12になる確立を求める サイコロのそれぞれの目は均等に出る という問題なのですが、計算方法がよく分かりません 手書きで出うる目をすべて書き出したところ、回答は25/216という事は出たのですが、これじゃ賢いやり方とはいえないですよね 正しい計算方法を教えていただきたいです よろしくお願いします

  • 確率【サイコロの目は毎回本当に1/6?】私が矛盾に感じる事を聞いてください!

    サイコロの目の出る確率について教えてください。 ●まず、サイコロを1回振った時に1が出る確率は1/6である。 ●次に2回目にサイコロを振った時に続けて1が出る確率も1/6である。 2回目だろうと、3回目だろうと、サイコロを振る行為は、その都度の 事なので、確率はいつまでも変わらず1/6ということですよね。 でも私は少し納得がいかない(?)ことがあるのです。 以下の理由を聞いてください。 サイコロを振った時に出る確率は1~6まで毎回均等に1/6である。 故にサイコロを30回振った時の目の数は、1~6まで各5回ずつである。 でも実際は偶然も重なり、目の数にはかなりバラつきがあると思います。 しかしサイコロを振る回数を千回、1万回と増やしていくごとに若干の誤差は あっても、各目の数は同じような数字に近づいていくのではないでしょうか。 そこで話が最初に戻ります。 1回目にサイコロを振った時に出た目が1だとします。 2回目にサイコロを振った時に出る目は2~6の確率が高いのではないですか? 何故なら最終的に各目の数が同じように揃うのなら、最初に1が出れば、2回 目には1以外の目が出ることにより、目の数が均等に分散しようとするのではないでしょうか。 すみません、つたない文章で質問の意味がお伝えできないかもしれません。 馬鹿らしいと思うかもしれませんが、できれば「そう決まっている」という のではなく、具体的に説明をして頂けると嬉しいです。 (でも数学の知識は無いので難しい公式とかは分からないです。)

  • C言語でサイコロのプログラムを作ってみたのですが

    まず、以下のような”実行するたびに1~6の数字をランダムに出力するプログラム”を 作ってみたのですが、特定の数字が出てこないのです。 例えば、1と4、2と5、3と6 が出ない ここで気がついた事は、 1、出ない目の2数の差は3であること。 2、乱数自体を表示させたところ、ちゃんと1秒毎に乱数は変わっている。こちらには問題はない 3、約1分間隔で、出ない数字の組み合わせが変わる。 (例えば 1,3,4,6,1,6,3,6,4(2と5が出ない)  →1分間実行し続けると・・・  2,3,6,5,3,2,2,6(1と4が出ない)) この原因は一体なんなのでしょうか・・・ とても気になって仕方がありません。わかる方教えてください。 以下、ソースコードになります #include<stdio.h> #include<time.h> #include<stdlib.h> int func(void); int main(void){ int number=0; number=func(); //サイコロの目の表示 printf("%d\n",number); return 0; } int func(){ //乱数の初期化 srand((int unsigned)time(NULL)); //サイコロの目をランダムで出力し、返す return rand()%6+1; } プログラムの仕組みは パソコンから現在の歴時刻を元に乱数の初期値を変更 ↓ rand関数で適当な値を受け取り、6で割った余剰+1を計算し値を返却する

  • iアプリ/サイコロの作り方

    Doja5.1 J2SDK1.4.2 を使ってソースを書いています。 まずサイコロを振るプログラムを作って、そのあとサイコロの数字を画像で表示できるようなものを作りたいです。 サイコロの画像はgifで用意してあります。 まずサイコロを振るプログラムですが以下のように書きました。 しかし、エラーが出ないにも関わらずエミュレータで動きません。 どこが間違っているのかどなたか教えてください。 また、画像を表示するほうのプログラムはどこを変えれば良いでしょうか。 よろしくお願い致します。 import com.nttdocomo.ui.*; import java.util.Random; class MainCanvas extends Canvas { int dice[] = new int[8*2]; Random rnd = new Random(); boolean init_flg = false; public MainCanvas() { setSoftLabel(Frame.SOFT_KEY_1,"サイコロ"); setSoftLabel(Frame.SOFT_KEY_2,"終了"); } public void paint( Graphics g ) { if(init_flg == false) { init_flg = true; return; } g.clearRect(0,0,200,2*8*13+30); int i; for(i=0;i<8*2;i++) { g.drawString(Integer.toString(i+1)+"回目のサイコロ",0,i*13+30); g.drawString(Integer.toString(dice[i]),100,i*13+30); } } public void processEvent( int type, int param ) { if( type == Display.KEY_PRESSED_EVENT ) { if( param == Display.KEY_SOFT1 ) { int i; for(i=0;i<8*2;i++) { dice[i] = rnd.nextInt(11)+2; } repaint(); } else if( param == Display.KEY_SOFT2 ) { IApplication.getCurrentApp().terminate(); } }

    • ベストアンサー
    • Java
  • さいころを360回振ったときの、3の目が出る回数

    「一様なさいころを360回振ったとき、3の目が出る回数aが50以下となる確率を計算しなさい。 (正規分布表を参照)」という問題を考えています。 二項分布を正規分布で近似すると、標準偏差は√50、平均値は60となると思いますが、ここからどのようにして考えればよいのかがわかりません。 もしも、わかられる方がいらっしゃれば、お教えいただければ幸いです。

  • サイコロの目の出る確率

     宜しくお願いします。  1~8までの目を持つ正8面体のサイコロが3個あります。これを振った時に次の目が出る確率を計算していたのですが、どうしても頭が途中で混乱してしまい計算できません(T_T)。数学に詳しい方、宜しくお願い致します。  (1):1・4・7の目が出る確率  (2):3個ゾロ目の出る確率  (3):4の目で2個のゾロ目が出る確率  (4):(3)以外の目で2個のゾロ目が出る確率  宜しくお願い致します。

  • 確率(+組合せ?)の計算

    サイコロを使った確率計算のやりかたを教えてください。 「1~6の目が均等な確率で出る6面体サイコロn個を振ったとき、ある数x以上の値の目がr個以上出る確率」を求めたい場合、どのように計算すればいいのでしょうか?  私が数学苦手で不定数の表しかた等よくわかっていないため、変な聞きかたになっていたらすみません。どうぞよろしくお願いします。

  • 条件ループ

    お世話になります。 JAVA初心者です。 以下のようにランダムに数字をINT型で作るまではできました。 double rnd=(Math.random()); Double db=new Double(rnd*10); int i=db.intValue(); そこで質問です。 出てきた値が「0」のときは何もせず再度上記のランダムを実行して「0」以外が出たときだけ次の作業に進むというプログラムはどのようにすればよいのでしょうか。 for文やif文も多少勉強中ですがすべて次の作業へ行ってしまうためランダムを繰り返す方法が分かりません。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 色の数値を別のフォームに引き渡したいです。

    色の数値を別のフォームに引き渡したいです。 Random rnd = new Random(); int red = rnd.Next(256); int green = rnd.Next(256); int blue = rnd.Next(256); このint redやint greenを新しく開くフォームにも同じ値を呼び出したいのですが、、、 よろしくお願いします。 開発環境はVC#2008です。

  • 確率の問題です。3個の正六面体のさいころをふるとき、3個のさいころの出

    確率の問題です。3個の正六面体のさいころをふるとき、3個のさいころの出る目の数の和が15であるという事象をAで表すことにする。このとき次の確率変数の確率分布の名称と平均を答えよ。 (1)3個のさいころをふることをAが初めて起こるまで繰り返すときの回数 (2)3個のさいころをふることを270回くりかえすときAが起こる回数 (3)3個のさいころをふることをAが5度起こるまで繰り返すときの回数  分かる方いらっしゃったら回答お願いします。

専門家に質問してみよう