C++ 標準ライブラリの seed_seq について

C++ 標準ライブラリの seed_seq について#

C++ 標準ライブラリに std::seed_seq というクラスがある。 これは、疑似乱数生成器の初期化時に複数の整数をシードとして与えるためのクラスであり、 以下のように使用できる。

// シード列(実際には std::random_device などで生成する。
std::vector<std::uint32_t> seeds = {1, 2, 3};
// seed_seq オブジェクトを生成する。
std::seed_seq seed_seq(seeds.begin(), seeds.end());
// 疑似乱数生成器に std::seed_seq オブジェクトを与えて初期化する。
std::mt19937 random_engine(seed_seq);

このように複数のシードを与えることができるため、

  • 複数のシードを与えることで乱数列の品質向上を狙う。

  • 異なる方法で生成したシードを混ぜる。 (例:時刻やハードウェアの温度をシードに混ぜるなど)

といった使い方ができる。

seed_seq に与える整数の個数を変化させてみる実験#

std::seed_seq に与える整数の個数を変化させ、 それぞれシードのうち 1 ビットだけを変化させたときに 初期段階の乱数列が何ビット変化するかを実験した。

生成する乱数は 32 ビット整数とした。 そのため、理想的な乱数においては乱数列の差分が 16 ビットになる。

実験結果を以下に示す。

シードの個数が 1 個でも最初からほぼ 16 になっており、十分異なる乱数が生成されている。

シードの個数による違いをこの実験では確認できなかった。

See also