- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語でサイコロのプログラムを作ってみたのですが)
C言語でサイコロのプログラムを作ってみたのですが、特定の数字が出ない理由はなんなのでしょうか?
このQ&Aのポイント
- C言語で作成したサイコロプログラムで特定の数字が出ない理由を知りたいです。
- 乱数を生成するC言語のサイコロプログラムで、特定の数字が出ない現象が起きています。なぜだか教えてください。
- C言語のサイコロプログラムで特定の数字が出ない問題があります。その原因を知りたいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
randでは「疑似乱数」といって、実際には計算で次の「乱数」を求めています。 直前の(計算方法によっては複数の)「乱数」を覚えておいて、次の「乱数」を計算しています。 そして、最初の状態を求めるのに使う値が「種(シード)」と呼ばれるものです。種が同じなら、同じ乱数列になります 種を設定するのがsrandです。 例えば。 あるときsrand(1)でrand()=1,3,5,4 ... となったら srand(1)とすれば、いつでも最初のrand()は1、次は3,次は5...となります。 さて、この疑似乱数は、その計算方法によってはあまり「乱数っぽくならない」ことがあります。 種が近い値の場合、乱数が近くなってしまうアルゴリズムもあります。 質の悪い乱数だと、一見バラバラに見えて、よくよく見ると、特定ビットに短い周期性が見られたりします。 6で割ったあまり、というのは上位ビットより下位ビットの影響が大きくなります。そして、「下位ビットに注目すると、全パターン出てこない」などということは有りえます。 おそらく、この複合で起こっているのでしょう。 ・srandで初期化するのは、普通は最初の1回だけです。 ・もっと上の位を使うようにする。例えば、rand()/(double)RAND_MAX*6.0と、全体を使うとか、 (rand () >> 4)%6 等と下位を捨てるとか ・rand自体があまり質のいい乱数ではないので、別のアルゴリズムを使う。
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
回答No.1
なんで毎回毎回毎回毎回初期化してるんだろう.
お礼
大変詳しく且つ丁寧に教えていただき有難うございました