プログラムの開始時に乱数ジェネレーターを1回だけシードするだけで十分かどうか疑問に思います。乱数を使う関数を書きます。関数内にrand()ジェネレーターをシードすることはありませんが、メインエントリでsrand()の呼び出しを残します。たとえば、私のプログラムは次のようになります。
void func1()
{
std::cout << "This is func1 " << std::rand() << std::endl;
}
void func2()
{
std::cout << "This is func2 " << std::rand() << std::endl;
}
int main()
{
std::srand(std::time(NULL));
func1();
func2();
return 0;
}
そうすることで、メインエントリからシードを簡単にオフに切り替えることができます。これは、プログラムをデバッグするときに役立ちます。シードせずにプログラムを実行するたびに、結果は同じに保たれます。ある乱数が原因で問題が発生した場合、別の乱数のセットを生成すると問題がなくなることがあるので、シードをオフにするこのような単純なメカニズムをお勧めします。
ただし、C ++ 11の新しいランダムユーティリティセットでは、使用する前に乱数ジェネレータをインスタンス化する必要があることに気付きました。(例:default_random_engine)。そして、ジェネレーターを個別にシードする必要があるたびに。新しいジェネレーターが必要になったときはいつでも、ジェネレーターを再シードすることが実際に奨励されているのだろうか。グローバルランダムジェネレーターを作成して、以前と同じように1回だけシードできることは知っていますが、グローバル変数を使用するというアイデアはまったく好きではありません。そうしないと、ローカルの乱数ジェネレーターを作成すると、デバッグなどの目的でシードをグローバルにオフにする機能が失われます。
C ++ 11の新機能を学ぶことにワクワクしていますが、非常に混乱する場合があります。新しいランダムジェネレーターに問題があった場合、誰かに知らせてもらえますか?または、C ++ 11のベストプラクティスは何でしょうか?