yohhoyの日記

技術的メモをしていきたい日記

C++標準ライブラリ乱数生成エンジンの動作

C++11標準ライブラリで追加された乱数生成エンジンでは、同一シード値を与えた場合には、処理系によらず同一の乱数列*1を生成する。ただしstd::default_random_engineは処理系定義(implementation defined)であり、std::random_deviceは非決定的な乱数列を生成しうるため、この2つは前述の限りではない。

<random>ヘッダで規定される定義済み乱数生成エンジンでは、各エンジンが生成する乱数列の10000番目の値を定めている。C++11(N3337) 26.5.5/p1より引用。

typedef linear_congruential_engine<uint_fast32_t, 16807, 0, 2147483647>
    minstd_rand0;

Required behavior: The 10000th consecutive invocation of a default-constructed object of type minstd_rand0 shall produce the value 1043618065.

なお、C/C++標準規格ではCライブラリrand()関数の動作は規定しないため、srand()関数で同一シード値を与えたとしても、異なるコンパイラ/ライブラリでは同一乱数列を生成する保証がない。ただし、「ある特定処理系の下で同一シード値を与えれば同一乱数列を生成すること」は保証される。*2

関連URL

*1:厳密には疑似乱数列。

*2:C99 7.20.2.2/p3より一部引用:"If srand is then called with the same seed value, the sequence of pseudo-random numbers shall be repeated."