0

参考までに、このスレッドをフォローしました。

main()この関数は、範囲内のランダムな値を返す関数から呼び出し[0, N]ます。

int randr(int min, int max) { int r = (rand() % (max+1-min)+min); return r; }

例えば:

int main()
{
unsigned int r=128;
while(r--)
{
    int a = randr(0, 63);
    int b = randr(64, 127);
    printf("%d   %d\n", a, b);
}
return 0;
}

問題は、プログラムが実行されるたびに、変数abが常に同じ生成値を含むことです。なぜ(つまり、端末上で常に同じデータをprintfするのですか)

4

4 に答える 4

4

のマニュアルページからrand

この関数は、0から 両端までの範囲(つまり、数学的な範囲)rand()の疑似乱数整数を返します。RAND_MAX[0, RAND_MAX]

この srand()関数は、引数を、によって返される疑似乱数整数の新しいシーケンスのシードとして設定しますrand()srand()これらのシーケンスは、同じシード値で呼び出すことで繰り返すことができます。

シード値が指定されていない場合、rand()関数には値1が自動的にシードされます。

最後の文は特に関連性があります。同じシードを使用すると、常に同じ疑似乱数のシーケンスを取得できます。また、明示的に使用しないためsrand()、シードは常に1です。

于 2013-03-15T03:59:08.867 に答える
2

C++のsrandを見てみてください。

于 2013-03-15T03:55:58.353 に答える
1

毎回異なるものをランダムシーケンスにシードする必要があります。

最も一般的なのはsrand((unsigned)time(NULL));です。

于 2013-03-15T04:00:34.407 に答える
0

シードが同じである限り、ランドは同じシーケンスを生成します。

于 2013-03-15T03:58:40.437 に答える