0

私はこれに対して30分頭をぶつけてきましたが、何が悪いのかわかりません。1 から 100 までの 10 個の乱数のリストを生成しようとしています。しかし、私がそれを実行すると、それらはすべて同じ番号になります。とてもイライラします!数字がまだRAMに保存されているからだと思ったのですが、乱数と変数を3回再ランダム化しても同じ数字が出てきます。私は何を間違っていますか?

コード:

main() {
    int i;
    int randnum;
    srand(time(NULL));
    randnum = rand() % 2;
    for (i = 0; i < 10; i++) {
        srand(time(NULL));
        randnum = rand() % 100 + 1;
        srand(time(NULL));
        rand();
        list[i] = randnum;
        srand(time(NULL));
        randnum = rand() % 100 + 1;
        srand(time(NULL));
        rand();
    }
    srand(time(NULL));
    randnum = rand() % 100 + 1;
}
4

3 に答える 3

7

何度も電話しないでくださいsrand()。このコードの実行には 1 秒もかからない可能性が高いためsrand(time(NULL))、実装で時間を秒単位で測定するときに呼び出すたびに、疑似乱数ジェネレーターを同じシードにリセットするだけで、すべての数値が同じになります。

于 2013-09-22T21:56:55.620 に答える
3

でジェネレーターを再初期化しないでくださいsrand(time(NULL))。コードの先頭で一度だけ使用してください。

于 2013-09-22T21:56:29.160 に答える
3

あなたが間違っているのは、乱数ジェネレーターの状態をリセットしていることです。

それが明らかでない理由は、あなたが時間を使っているからです。time は time_t を返します。これは、標準によれば、「現在のカレンダー時間に対する実装の最良の近似値」です。これは通常、UTC 1970 年 1 月 1 日 00:00 からの秒数を表します。これで、コードはおそらく 1 ミリ秒以内に実行されるため、すべての呼び出しで同じ値が返されます。

したがって、コードは次と同等です。

int const somenum = time(NULL); 
srand(somenum); //reset state using some seed.

//rand() will always produce the same value after an
// srand call of the same seed.
randnum = rand() % 100 + 1; 
srand(somenum); //reset state using some seed.
randnum = rand() % 100 + 1; 
srand(somenum); //reset state using some seed.
randnum = rand() % 100 + 1; 
srand(somenum); //reset state using some seed.
randnum = rand() % 100 + 1; 

これをテストするには、rand への呼び出しごとにキーを押すのを待ちます。それらが異なることがわかります。

これを修正する方法は、最初に srand(time(NULL)) を 1 回だけ呼び出すことです。

さて、C++11 では別の方法があります。

#include <iostream>
#include <random>  

int main()
{
    const int rand_max = 20;
    std::default_random_engine rng(std::random_device{}());
    std::uniform_int_distribution<> dist(0, rand_max);
    std::cout<<"This will always be as random a number as your hardware can give you: "<<dist(rng)<<std::endl;
    return 0;
}

std::random_device は、利用可能な場合は組み込みのハードウェア乱数ジェネレーターを使用するため、時間のシードについて心配する必要はありません。本当に疑似乱数が必要な場合は、別の乱数ジェネレーターを使用してください。

C++11 で乱数分布を制御することもできます。

于 2013-09-22T22:07:40.677 に答える