0

重複の可能性:
C++ アプリケーションで srand() を呼び出す頻度は?

複数のサイコロを転がす機能を実装しようとしていますが、私のコードでは、2 つ以上のサイコロを作成しても、常に同じ数字を転がすように見えます。これが私のコードです:

Dice::Dice() {}

void Dice::roll() 
{
srand(time(0));
setFaceValue((rand() % MAX_FACE_VALUE + 1));
}

int Dice::getFaceValue()
{
return currentFaceValue;
}

void Dice::setFaceValue(int value) 
{
currentFaceValue = value;
}

これをドライバーにプログラムすると、同じ数が 3 回得られます。

int main()
{
Dice d1, d2, d3;
d1.roll();
cout << d1.getFaceValue() << endl;

d2.roll();
cout << d2.getFaceValue() << endl;

d3.roll();
cout << d3.getFaceValue() << endl;
}
4

1 に答える 1

1

RNG の「シード」は、オブジェクト b1 - b3 が作成される時間よりもゆっくりと変化するタイム スケールを使用していると思われます。つまり、あなたの time(0) 呼び出しは、b1 - b3 が作成され、それらの roll() メソッドを呼び出すほど速く変化しません。

オブジェクトの作成時に最初に 3 つの異なるシード時間を使用して、異なる RNG を確保するか、1 RNG の関数を使用して、より多くの RNG 番号を抽出するための 1 対 1 の値のマッピングを作成することができます。

だから一言で言えば、ゆっくり!呼び出しの間に sleep() 呼び出しを追加すると、状況が変わる可能性があります。

于 2012-12-04T05:35:04.380 に答える