時間に関係なく、C 言語で乱数を生成する方法はありますか。一度に乱数の配列を生成したいという考えですが、 rand() メソッドは時間に依存するため、配列内のすべての値が同様に生成されます。
質問する
989 次
2 に答える
3
rand()
は値を順次(時系列で) 生成しますが、ジェネレーターに をシードしない限り、時間 (「時刻」など) には依存しませんsrand(time(NULL))
。これをしないと、1
(one) に依存します。
rand_r()
現在のシードの値を返す (POSIX)もあります。これらを使用して、適切なシード値を保存および復元することにより、乱数の複数のストリームを調整できます。
使用しない非決定論的なシードの場合、time(NULL)
おそらくシステム固有のソース ( /dev/random
UNIX の場合) に頼る必要があります。
絶対にこれを行わずmyrand()
、 の代わりに使用してrand()
ください。これにより、各クロック秒の間、各呼び出しに対して同じ値が返されます。
unsigned myrand() { // BAD! NO!
srand(time(NULL)); // re-seeding destroys the properties of `rand()`
return rand();
}
を呼び出す場合は、プログラムの最初に1 回だけsrand()
にする必要があります。
の逐次決定論は、rand()
実際にはプログラムのテストに非常に役立つ特性です。得られるのは (ほぼ) ランダムですが、反復可能なシーケンスです。プログラムの開始時にシード値を出力すると、同じ値を再利用して同じ結果を生成できます (その実行で機能しない場合など)。
于 2013-06-02T19:59:59.687 に答える