Мои случайные числа, которые выводятся, выводятся в одной и той же последовательности каждый раз, когда я запускаю свою игру. Почему это происходит?
У меня есть
#include <cstdlib>
, и я использую его для генерации случайных чисел
randomDiceRollComputer = 1 + rand() % 6;
Вам нужно заполнить свой генератор случайных чисел:
Попробуйте поставить это в начале программы:
srand ( time(NULL) );
Обратите внимание, что вам нужно #include <ctime>
.
Идея заключается в том, что каждый раз, когда вы запускаете программу, нужно заполнять ГСЧ новым номером. Используя время в качестве начального числа, вы получаете разные числа при каждом запуске программы.
Вам нужно дать генератору случайных чисел начальное число. Это можно сделать, используя текущее время, так как мы надеемся, что это какой-то случайный случай.
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
int r;
srand(time(0));
r = rand();
return 0;
}
Функция rand()
, в частности, требуется для создания одинаковой последовательности чисел при посеве с заданным начальным числом (путем вызова srand()
); Каждое возможное начальное значение указывает последовательность. И если вы никогда не позвоните srand()
, вы получите ту же последовательность, которую получили бы, позвонив srand(1)
перед любым вызовом rand()
.
(Это не относится к различным реализациям C или C ++.)
Это может быть полезно для целей тестирования. Например, если в вашей программе есть ошибка, вы можете воспроизвести ее, повторно запустив ее с тем же начальным числом, гарантируя, что (за исключением других непредсказуемых действий) вы получите ту же последовательность псевдослучайных чисел.
Вызов srand(time(NULL))
- это обычный рекомендуемый способ получения более или менее непредсказуемых псевдослучайных чисел. Но это не идеально. Если ваша программа запускается дважды в течение одной и той же секунды, вы, вероятно, получите ту же самую последовательность, потому что time()
(обычно) имеет разрешение в 1 секунду. А типичные реализации rand () недостаточно достаточно хороши для криптографического использования; злоумышленнику слишком легко угадать, какие цифры вы собираетесь получить.
Существует ряд других реализаций случайных чисел. В системах Linux есть два псевдоустройства, /dev/random
и /dev/urandom
, с которых вы можете считывать достаточно качественные псевдослучайные байтовые значения. Некоторые системы могут иметь функции, такие как random()
, drand48()
и так далее. И есть множество алгоритмов; Я слышал хорошие вещи о Мерсенн Твистер .
Для чего-то вроде игры, где вы не ожидаете или не заботитесь о игроках, пытающихся обмануть, srand(time(NULL))
и rand()
, вероятно, достаточно хороши. В более серьезных целях вы должны получить совет от того, кто знает об этом больше, чем я.
Раздел 13 из comp.lang.c FAQ содержит очень хорошую информацию о генерации псевдослучайных чисел.
Генераторы псевдослучайных чисел берут начальное число или начальное число, а затем генерируют следующее число в последовательности из этого. Вот почему они называются псевдослучайными, потому что, если они всегда используют одно и то же начальное значение, они будут генерировать ту же последовательность чисел, что и стандартный генератор C языка lib. Это можно исправить, задав для генератора начальное значение, которое изменится при следующем запуске программы, как текущее время.
В любом случае, код, который вы ищете, как сказали другие:
srand(time(0)); //Seed the generator, give it a starting value