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