6

したがって、rand_r関数を使用する複数のスレッドがあります。この関数のシグネチャは次のとおりです。

int rand_r(int *val);

この関数をシードするために時間を使用しようとしましたが、さまざまな問題が発生しています。誰かが私に時間を使ってrand_rを呼び出す方法、またはrand_rを動的にシードする他の簡単な方法を説明してもらえますか?

ありがとう!

4

2 に答える 2

15

再入可能なバージョンrand_rの場合、シードは状態の初期値にすぎません。スレッドごとに1つのシードが必要です。シードの配列を作成するか、シード変数をスレッドローカルにします。

_Thread_local unsigned int seed = time(NULL);

int do_stuff()
{
    for ( ; ; )
    {
        int n = rand_r(&seed);
        // use n
    }
}
于 2012-10-13T02:53:09.277 に答える
0

UNIX / POSIXシステムでは/dev/urandom、最初の乱数を開いて、各スレッドのシードを取得するのに十分なバイトを読み取ることができます。Microsoft Windowsには、そのような数値を取得するためのより複雑な方法があります。詳細については、 CryptGenRandomを検索してください。これらはシステムエントロピーに基づいているため、大量の乱数用ではありません。

于 2012-10-13T03:18:07.630 に答える