C++でrand()とsrand()で乱数を生成

3127 ワード

標準ライブラリ(に含まれる)には、疑似乱数の生成を支援する2つの関数があります.
関数1:int rand(void);srand(seed)で指定したseedから、[seed,RAND_MAX(0 x 7 fff))間のランダムな整数が返されます.
関数2:void srand(unsigned seed);パラメータseedはrand()のシードであり、rand()の開始値を初期化するために使用されます.rand()は、呼び出されるたびに、1)ユーザが以前にsrand(seed)を呼び出し、seedに値を指定した場合、srand(seed)を自動的に呼び出して開始値を初期化すると考えられる.2)ユーザがこれまでsrand(seed)を呼び出したことがない場合、srand(1)は自動的に呼び出されます.
上記の第1の点から、1)rand()がプログラムの実行たびに発生する値が異なる場合は、srand(seed)のseedに変値を与えなければならない.この変値は、プログラムの実行時ごとに異なる(例えば、これまでの経過時間)必要があります.2)そうでない場合、seedに一定値が指定されている場合、プログラムの実行時にrand()が生成する値は同じですが、この値は[seed,RAND_MAX(0 x 7 fff))間のランダムに取得された値です.3)rand()が呼び出された場合以前はsrand(seed)を呼び出したことがなく、効果はsrand(1)を呼び出してrand()を呼び出すのと同じである(1も一定値である).いくつかの例を挙げると、0~6の間のランダム整数(6自体を含まない):例1、seedを指定しない:
for(int i=0;i<10;i++){  
ran_num=rand() % 6;
cout<

実行するたびに出力されます:5 5 4 4 5 4 0 4 2
例2では、seedを定値1として指定します.
srand(1);
for(int i=0;i<10;i++){  
ran_num=rand() % 6;
cout<" ";
}

実行するたびに出力されます:5 5 4 4 4 0 4 2は例1の結果と全く同じです.
例3では、seedを定値6として指定します.
srand(6);
for(int i=0;i<10;i++){  
ran_num=rand() % 6;
cout<" ";
}

実行するたびに出力されます:4 1 5 1 4 4 4 2ランダム値も[0,6]の間で、得られた値はsrand(1)とは異なりますが、実行するたびに結果は同じです.
*例4、seedが現在のシステムが経過した時間(秒単位):time_t time(0):*
#include 
srand((unsigned)time(0));
for(int i=0;i<10;i++){  
ran_num=rand() % 6;
cout<" ";
}

1回目の実行時出力:0 1 5 4 5 0 2 4 2 2 2回目:3 3 3 0 3 5 2 3とにかく、プログラムを起動するたびに時刻が異なるため、実行結果は異なります(間隔は1秒以上でなければなりません).
time_についてt time(0): time_tは長整型として定義され、1970年1月1日0時0分0秒からこれまでの時間を秒単位で返した.
また、ran_についてnum=rand()%6で、rand()の戻り値と6をモデリングする必要があります.これにより、目的のランダム数が[0,6]の間に落ちることを確保できます.そうしないと、rand()の戻り値自体が巨大になる可能性があります.一般的な式は、[a,b]の間のランダム整数を取得するには、(rand()%(b-)a(結果値はaを含まない)を使用します.
aが0の場合、rand()%bと略記される.