重複の可能性:
srand を初期化する推奨方法?
c で srand() を使用すると、次の問題が発生します。
loopでsrand(time(NULL)) を呼び出しますが、ループは1秒前に終了し、rand() を呼び出すたびに同じ値が得られます。
どうすればこれを解決できますか?
重複の可能性:
srand を初期化する推奨方法?
c で srand() を使用すると、次の問題が発生します。
loopでsrand(time(NULL)) を呼び出しますが、ループは1秒前に終了し、rand() を呼び出すたびに同じ値が得られます。
どうすればこれを解決できますか?
なぜあなたsrand
はループで電話をかけているのですか?rand
プログラムの開始時に 1 回呼び出すだけで、その後は何度でも呼び出すことができます。
srand
の目的は、乱数ジェネレーターを初期化することです。
そのパラメータはシードと呼ばれます。同じシードを2回与えると、乱数ジェネレーター(以降のへの呼び出しrand()
)が同じ「乱数」シーケンスを返すことが期待できます。
あなたの場合、常に同じ値でsrandを呼び出しているので(2番目が変更されるまで)、rand()は常に同じ値を返します。
srand
一度電話するだけです。
ループ内で srand を呼び出さないでください。なぜあなたはこれをやっている?
ループの外で一度初期化するだけです。
srand()
一度初期化するだけでrand()
、乱数を生成するために使用するだけです。乱数を生成するには、より良いランダムアルゴリズムを使用しますか?
1 から 10 までのランダムな整数を生成する場合は、次のように常に上位ビットを使用して行う必要があります。
j = 1 + (int) ( 10.0 * ( rand() / ( RAND_MAX + 1.0 ) ) );
シードは unix エポックからの秒数である time() にバインドされているため、基本的にはループに 1 秒もかからないため、同じシードを与えています。
あなたがすべきことは、時間をマイクロ秒単位で取得することです。Windows google microseconds win32 C 用にコーディングしている場合は、gettimeofday() を見てください。double から integer に変換する必要があるので、これを行うだけです (unsigned int)double * 100.0f;
あなたの助けを借りて答えを見つけました。
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);