stdlib の rand() によるマルチスレッドと乱数生成
マルチスレッド アプリケーションでは、多くの場合、各スレッドが一意の乱数シーケンスを生成する必要があります。ただし、標準ライブラリ関数 srand(time(0)) を使用して乱数生成器 (RNG) をシードすると、非ランダムな結果が生じる可能性があります。
スレッド セーフティの問題
srand(time(0)) は、擬似乱数の生成に使用される RNG の内部状態を初期化します。マルチスレッド環境では、複数のスレッドが同じ RNG 状態に同時にアクセスする可能性があり、共有シード値と同一の番号シーケンスが発生します。
解決策: スレッドセーフ シード
スレッドセーフな乱数生成を保証するには、明示的な状態引数を取る rand_r() 関数を使用することをお勧めします。各スレッドに一意の状態変数を渡すことで、RNG 状態を分離し、各スレッドが独自のランダム シーケンスを生成できるようにします。
代替: スレッド セーフ ジェネレーター
あるいは、マルチスレッド アプリケーション向けに特別に設計された drand48() 関数の使用を検討してください。 rand() よりも大きく信頼性の高いエントロピー ソースが提供され、デフォルトではスレッドセーフです。
使用例:
#include <stdlib.h> unsigned int thread_state; void thread_function() { // Seed the state for this thread rand_r(&thread_state); // Generate random numbers using the seeded state int random_number = rand_r(&thread_state); }
結論:
マルチスレッド環境で rand() を使用する場合、シードすることが不可欠ですrand_r() のようなスレッドセーフ関数を備えた RNG。あるいは、drand48() などのスレッドセーフな乱数ジェネレーターの使用を検討してください。これにより、各スレッドが独自の一意の乱数シーケンスを生成し、スレッド間で同じ数値が発生する問題を回避します。
以上がマルチスレッド C アプリケーションで一意の乱数を生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。