質問: C++の関数rand()は、 単体で用いるといつも同じ数字を返し、 srandと合わせて用いると実行する度に異なる数字を返しますが、 このような違いはなぜ生じるのでしょうか? rand関数の乱数はある初期値を元に計算されますが、その初期値の設定のタイミングが異なるのでしょうか? ``` #include #include using namespace std; int main() { cout << rand() << endl; } ``` ``` #include #include #include using namespace std; int main() { srand((unsigned)time(0)); cout << rand() << endl; } ```
回答: srandに与える引数に依って利用する疑似乱数列が定められます。 ですので、例えば srand(0) などとすればやはり同じ乱数列が生成されます。 srandを呼び出さずにrandを用いた場合、srand(1) の乱数列を用いるそうです。 実際に srand(1) を呼び出した結果と比較してみると良いでしょう。 > > **void srand( unsigned seed );** > > Seeds the pseudo-random number generator used by std::rand() with the value seed. > > If rand() is used before any calls to srand(), rand() behaves as if it was seeded with srand(1). > > Each time rand() is seeded with the same seed, it must produce the same sequence of values. > > > 引用元: cppreference.com > std::srand srandの有無を超えて、シード値を毎回変えているかどうかの方が重要です。 シード値として時刻を与えているのは、実行ごとに別の値を使うための工夫でしかありません。 実験 **srandを呼び出さない場合** Wandbox ``` 1804289383 846930886 1681692777 1714636915 1957747793 424238335 719885386 1649760492 596516649 1189641421 ``` **srand(1)を与えた場合** Wandbox ``` 1804289383 846930886 1681692777 1714636915 1957747793 424238335 719885386 1649760492 596516649 1189641421 ``` 実際に同じ結果になることが確認できます。