ホームページ >バックエンド開発 >C++ >マルチスレッド C アプリケーションで一意の乱数を生成するにはどうすればよいですか?

マルチスレッド C アプリケーションで一意の乱数を生成するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-13 14:24:11226ブラウズ

How Can I Generate Unique Random Numbers in Multithreaded C   Applications?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。