8

乱数を生成する次のメソッドがあります。

int random_number() //Random number generator
{
    int x = rand() % 1000000 + 1; //Generate an integer between 1 and 1000000
    return x;
}

このメソッドの呼び出しは、5 回反復するループで使用されます。この方法の問題点は、プログラムを数回実行すると常に同じ数値が生成されるように見えることです。これはどのように解決できますか?

4

4 に答える 4

16

次のような乱数ジェネレーターをシードする必要があります。

srand ( time(NULL) );
int x = rand() % 1000000 + 1;

疑似乱数ジェネレーターをシードすると、基本的に、反復する乱数セットが決定されます。時間を使用することは、適切にランダムな結果を得る標準的な方法です。

編集:

明確にするために、シードは 1 回だけにして、次のような多くの乱数を取得する必要があります。

srand ( time(NULL) );
loop {
    int x = rand() % 1000000 + 1;
}

次のようなものではなく:

loop {
    //Particularly bad if this line is hit multiple times in one second
    srand ( time(NULL) ); 
    int x = rand() % 1000000 + 1;
}
于 2012-11-07T16:52:00.820 に答える
5

srand(time(NULL));プログラムの起動時に呼び出します。

srandrand 関数にシードを設定します。戻り値を与えると、time(NULL)プログラムの実行ごとに異なるシードを取得するのに役立ちます。

質問に c++ のタグを付けたので、c++11 機能を使用して乱数生成を処理できます。

于 2012-11-07T16:51:17.997 に答える
1

femtoRgonは正しいです。これによりプログラムがシードされますが、乱数生成が改善されているため、新しい C++ 標準を見てください。

C++0x の乱数

于 2012-11-07T16:52:38.840 に答える
1

rand は実際には乱数ではなく、値の生成に使用されたアルゴリズムがわからない場合にランダムに「見える」疑似乱数です。マニュアルページから:

rand() 関数は、0 から RAND_MAX までの範囲の疑似乱数整数を返します。

疑似ランダムとは、シードと呼ばれる同じ入力が与えられると、同じ出力が得られることを意味します。これは、同じ「ランダムな」値が返され、問題を再現できるため、問題をデバッグしようとしているときに実際に非常に役立ちます。本当にランダム性が必要な場合は悪いです。

上記のように、エポックからの秒数など、実行ごとにシードを異なるものに変更することで、rand() への呼び出しから異なる値を取得できます。

srand(time(NULL))

デバッグしようとしている場合は、シードを印刷して、問題が発生した場合に再現できるようにすることをお勧めします。

于 2012-11-07T16:55:27.040 に答える