-6

時間に関係なく、C 言語で乱数を生成する方法はありますか。一度に乱数の配列を生成したいという考えですが、 rand() メソッドは時間に依存するため、配列内のすべての値が同様に生成されます。

4

2 に答える 2

3

rand()は値を順次(時系列で) 生成しますが、ジェネレーターに をシードしない限り、時間 (「時刻」など) には依存しませんsrand(time(NULL))。これをしないと、1(one) に依存します。

rand_r()現在のシードの値を返す (POSIX)もあります。これらを使用して、適切なシード値を保存および復元することにより、乱数の複数のストリームを調整できます。

使用しない非決定論的なシードの場合、time(NULL)おそらくシステム固有のソース ( /dev/randomUNIX の場合) に頼る必要があります。


絶対にこれを行わず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 に答える