0

重複の可能性:
srand を初期化する推奨方法?

c で srand() を使用すると、次の問題が発生します。

loopでsrand(time(NULL)) を呼び出しますが、ループは1秒前に終了し、rand() を呼び出すたびに同じ値が得られます。

どうすればこれを解決できますか?

4

6 に答える 6

1

なぜあなたsrandはループで電話をかけているのですか?randプログラムの開始時に 1 回呼び出すだけで、その後は何度でも呼び出すことができます。

于 2012-11-22T21:06:47.527 に答える
0

srandの目的は、乱数ジェネレーターを初期化することです。

そのパラメータはシードと呼ばれます。同じシードを2回与えると、乱数ジェネレーター(以降のへの呼び出しrand())が同じ「乱数」シーケンスを返すことが期待できます。

あなたの場合、常に同じ値でsrandを呼び出しているので(2番目が変更されるまで)、rand()は常に同じ値を返します。

srand一度電話するだけです。

于 2012-11-22T21:13:02.097 に答える
0

ループ内で srand を呼び出さないでください。なぜあなたはこれをやっている?

ループの外で一度初期化するだけです。

于 2012-11-22T21:07:03.080 に答える
0

srand()一度初期化するだけでrand()、乱数を生成するために使用するだけです。乱数を生成するには、より良いランダムアルゴリズムを使用しますか?

1 から 10 までのランダムな整数を生成する場合は、次のように常に上位ビットを使用して行う必要があります。

j = 1 + (int) ( 10.0 * ( rand() / ( RAND_MAX + 1.0 ) ) );
于 2012-11-22T21:08:15.087 に答える
0

シードは unix エポックからの秒数である time() にバインドされているため、基本的にはループに 1 秒もかからないため、同じシードを与えています。

あなたがすべきことは、時間をマイクロ秒単位で取得することです。Windows google microseconds win32 C 用にコーディングしている場合は、gettimeofday() を見てください。double から integer に変換する必要があるので、これを行うだけです (unsigned int)double * 100.0f;

于 2012-11-22T21:24:19.180 に答える
0

あなたの助けを借りて答えを見つけました。

        struct timeval tv;
        gettimeofday(&tv,NULL);
        unsigned long time_in_micros = 1000000 * tv.tv_sec + tv.tv_usec;//find the microseconds for seeding srand()
        srand(time_in_micros);
于 2012-11-22T21:47:32.367 に答える