2

rand()一意の値が必要な 6 桁のフィールドに使用しています。私はそれを正しくやっていますか?

オッズrand()は?

rand() を使用したときはユニークでした。でも、srand(time(NULL))や に電話したら同じ番号が返ってきたsrand(clock())。どうやら、私にとっては逆に機能しているようです。またはそれは?

4

4 に答える 4

3

他の人が指摘しているように、一意性は保証されていません。ただし、srand() と rand() を正しく使用していないため、数値が繰り返されている可能性があります。

srand() は、乱数ジェネレーターをシードするために使用されます。つまり、srand を呼び出した後に一連の rand() を呼び出すと、特定の一連の値が生成されます。同じ値で srand() を呼び出すと、rand() は同じ一連の値を生成します (特定の実装では、異なる実装間で保証はありません)。

int main() {
    srand(100);
    for(int i = 0; i<5; ++i)
        printf("%d\n",rand());

    printf("\nreset\n\n");

    srand(100);
    for(int i = 0; i<5; ++i)
        printf("%d\n",rand());

}

私にとって、これは以下を生成します:

365
1216
5415
16704
24504

reset

365
1216
5415
16704
24504

time() と clock() は時間を返しますが、それらを十分にすばやく呼び出すと、返される値は同じになるため、rand() から同じ一連の値が得られます。

さらに、rand() は通常、あまり良い乱数ジェネレーターではなく、通常、これを使用すると、一連の数値を実際に必要な分布に変換する必要があります。ランダム性の別のソースを見つけて、必要な分布を生成する適切な方法を学ぶか、それを実行できるライブラリを使用する必要があります。(たとえば、0 から N の間の「乱数」を生成する一般的な方法の 1 つに dorand() % Nがありますが、これは実際には最善の方法ではありません。

C++ は、より優れた乱数ライブラリを .NET で提供しています<random>。linear_congruential、mersennne_twister などのさまざまな PRNG アルゴリズムを提供し、場合によっては暗号的に安全な RNG (実装によって異なります) も提供します。また、uniform_int_distribution など、さまざまな分布を生成するためのオブジェクトも提供しますrand() % N

于 2012-09-13T18:07:20.877 に答える
3

rand()0 ~ の値を返しますRAND_MAX。これは離散一様分布であるため、1/( RAND_MAX+1) の確率で数値が繰り返されるため、一意性は保証されません。

srand(seed)乱数ジェネレーターを初期化して、毎回rand()初期化する場合、から取得される数値のシーケンスが毎回同じになるようにしますseed

あなたの例seed = time(NULL)では、1970 年 1 月 1 日から経過した秒数であるため、異なるシードが確保され、呼び出しごとに異なる乱数シーケンスが保証されますsrand(time(NULL))(同じ秒内に行われていないと仮定します)。

于 2012-09-13T18:03:01.110 に答える
2

乱数はランダムであり、一意ではありません。サイコロを振って複数の 6 を続けて転がすことができる状況と同じように、rand同じ数字が出ることもあります (そうあるべきです)。

番号が一意であることを確認するために、既に追加した各番号を登録するセットを作成します。乱数が複数回出てきたら、2 番目の乱数を捨てて、次の乱数に進みます。

于 2012-09-13T18:04:21.720 に答える
0

rand() は、連続した呼び出しまたは頻繁な呼び出しで同様の値を返す可能性がありますか?

のアルゴリズムはrandC では指定されていません。 によって返される数値のランダム性の品質も同様ですrand

ここに画像の説明を入力

于 2012-09-13T18:14:31.550 に答える