ホームページ >バックエンド開発 >C++ >C の `rand()` 関数を使用して複数のスレッドで一意の乱数を生成するにはどうすればよいですか?

C の `rand()` 関数を使用して複数のスレッドで一意の乱数を生成するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-16 09:28:14980ブラウズ

How Can I Generate Unique Random Numbers in Multiple Threads Using C's `rand()` Function?

stdlib の rand() のマルチスレッド使用

マルチスレッド プログラミング シナリオでは、多くの場合、別のスレッドで乱数を生成する必要があります。ただし、標準ライブラリの rand() 関数を使用する場合、正しく処理されないと問題が発生する可能性があります。

問題

同じ関数を実行する複数のスレッドは、同じ乱数を繰り返し生成します。これは、通常、各スレッドには、すべてのスレッドで共有される rand() の内部状態を含むグローバル データの独自のコピーがあるためです。

解決策

同じ乱数の生成を避けるための場合、rand()の内部状態を明示的に管理する必要があります。ドキュメントでは次のことを推奨しています:

  • 明示的な状態ポインターで rand_r() を使用する: rand_r() は、状態として使用される符号なし整数へのポインタ。
  • 使用弱いがスレッドセーフなオプションの drand48_r(3): drand48_r(3) は、より大きな内部状態を使用する、代替のスレッドセーフな疑似乱数生成器です。

使用例

たとえば、マルチスレッド環境で rand_r() を使用するには、次のようにします。 would:

#include <stdlib.h>

void* thread_function(void* arg) {
  unsigned int state = 0;  // Thread-specific state
  while (1) {
    int random_number = rand_r(&state);
    // Do something with random_number
  }
  return NULL;
}

重要な注意

スレッドを適切に同期せずに rand() または rand_r() を使用すると、予期しない動作や不正な結果が発生する可能性があることに注意してください。乱数生成器を含む共有リソースへのマルチスレッド アクセスを処理するために、適切な同期メカニズムが整備されていることを常に確認してください。

以上がC の `rand()` 関数を使用して複数のスレッドで一意の乱数を生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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