プロが教えるわが家の防犯対策術!

まず、以下のような”実行するたびに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を計算し値を返却する

A 回答 (2件)

なんで毎回毎回毎回毎回初期化してるんだろう.

    • good
    • 0

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自体があまり質のいい乱数ではないので、別のアルゴリズムを使う。

参考URL:http://www001.upp.so-net.ne.jp/isaku/rand.html
    • good
    • 0
この回答へのお礼

大変詳しく且つ丁寧に教えていただき有難うございました

お礼日時:2012/03/04 23:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!