個別の乱数を生成するタスクを負った共通の関数を呼び出す複数のスレッドを使用する場合、次のことを考慮することが重要です。乱数発生器を初期化するためのアプローチ。関数 srand(time(0)) は、ジェネレーターの初期化を担当します。ただし、コード内での配置は結果の一貫性に影響を与える可能性があります。
srand(time(0)) をプログラム全体で、各関数実行の開始時に 1 回呼び出す必要があるかどうかという問題が生じます。
その答えは、rand() に関連するスレッドの安全性の問題にあります。ドキュメントには、 rand() がスレッドセーフではないことが明示されています。これは、rand() が呼び出されるたびに隠し状態を変更することを意味します。スレッド間で一貫した動作を保証するには、状態を明示的に処理する必要があります。
代替関数 rand_r() は、符号なし整数へのポインタを状態として受け入れ、最小限の状態情報を提供します。この関数を使用すると、擬似乱数発生器の強度が低下します。拡張オプションとして、drand48_r(3) が推奨されます。
したがって、複数のスレッド間で予測可能な乱数生成を維持するには、rand_r() や drand48_r(3) のようなスレッドセーフ関数を代わりに利用する必要があります。 rand().
以上がC でスレッドセーフな乱数生成を保証するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。