http://www.cplusplus.com/reference/clibrary/cstdlib/rand/で、次のように読みました。このアルゴリズムはシードを使用してシリーズを生成します。シリーズは、srandを使用して特定の値に初期化する必要があります。
シードとはどういう意味ですか?rand()はシードを使用してシリーズを生成しますか?
http://www.cplusplus.com/reference/clibrary/cstdlib/rand/で、次のように読みました。このアルゴリズムはシードを使用してシリーズを生成します。シリーズは、srandを使用して特定の値に初期化する必要があります。
シードとはどういう意味ですか?rand()はシードを使用してシリーズを生成しますか?
rand()
いわゆる疑似乱数ジェネレーターを使用します。実際には乱数ではなく、十分にランダムに見え、いくつかの統計的特性を満たす決定論的なシーケンスを生成します。シードは本質的にそのシーケンスの開始値です。同じシードを指定すると、PRNG は常に同じシーケンスを生成します。そのため、現在の時刻など、あまり決定論的ではないものをシードすることがよくあります(ただし、タイトなループで PRNG を再シードするか、プログラムを連続または並列で十分に高速に実行すると失敗します)。
ほとんどの場合、C の PRNG は単純な線形合同ジェネレーターです。次の式を使用して、シーケンス内の次の数値を計算します。
ここでの aとbは、恐ろしい結果を避けるために慎重に選択する必要がある値です。たとえば、明らかな理由から、 2 は にとって非常に悪い選択です。cは数値を特定の範囲に減らすだけで、多くの場合 2 の累乗になります。シードは単に 0 番目の値を提供します。
非常に大雑把に言えば、次のようなものです。
int rand() {
return last_random_val =
((last_random_val * 1103515245) + 12345) & 0x7fffffff);
}
void srand(int seed) {
last_random_val = seed;
}
を呼び出すと、last_random_val
が に設定されます。したがって、同じシードに対して、同じ数列が生成されます。seed
srand()