したがって、rand_r関数を使用する複数のスレッドがあります。この関数のシグネチャは次のとおりです。
int rand_r(int *val);
この関数をシードするために時間を使用しようとしましたが、さまざまな問題が発生しています。誰かが私に時間を使ってrand_rを呼び出す方法、またはrand_rを動的にシードする他の簡単な方法を説明してもらえますか?
ありがとう!
再入可能なバージョンrand_r
の場合、シードは状態の初期値にすぎません。スレッドごとに1つのシードが必要です。シードの配列を作成するか、シード変数をスレッドローカルにします。
_Thread_local unsigned int seed = time(NULL);
int do_stuff()
{
for ( ; ; )
{
int n = rand_r(&seed);
// use n
}
}
UNIX / POSIXシステムでは/dev/urandom
、最初の乱数を開いて、各スレッドのシードを取得するのに十分なバイトを読み取ることができます。Microsoft Windowsには、そのような数値を取得するためのより複雑な方法があります。詳細については、 CryptGenRandomを検索してください。これらはシステムエントロピーに基づいているため、大量の乱数用ではありません。