Возможный дубликат:
Как часто мне следует вызывать srand () в приложении C ++?
Я пытаюсь реализовать бросание нескольких кубиков, но с моим кодом, даже если я создаю 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;
}
Я подозреваю, что ваш «начальный» ГСЧ использует шкалу времени, которая изменяется медленнее, чем как скоро создаются ваши объекты b1 — b3; т. е. ваш вызов time (0) не меняется так быстро, как создаются b1 — b3 и вызывают их метод roll ().
Вы можете использовать 3 разных времени начала в начале создания объекта, обеспечивая другой RNG, или использовать функции 1 RNG для создания однозначных сопоставлений для извлечения большего числа номеров RNG.
Так что одним словом — медленно! Добавление вызовов sleep () между вызовами может изменить ситуацию.
Других решений пока нет …