Одинаковые случайные числа каждый раз, когда я запускаю программу.

Мои случайные числа, которые выводятся, выводятся в одной и той же последовательности каждый раз, когда я запускаю свою игру. Почему это происходит?

У меня есть

#include <cstdlib> 

, и я использую его для генерации случайных чисел

randomDiceRollComputer = 1 + rand() % 6;
25
задан Keith Thompson 13 October 2011 в 01:17
поделиться

4 ответа

Вам нужно заполнить свой генератор случайных чисел:

Попробуйте поставить это в начале программы:

srand ( time(NULL) );

Обратите внимание, что вам нужно #include <ctime>.

Идея заключается в том, что каждый раз, когда вы запускаете программу, нужно заполнять ГСЧ новым номером. Используя время в качестве начального числа, вы получаете разные числа при каждом запуске программы.

30
ответ дан 28 November 2019 в 21:10
поделиться

Вам нужно дать генератору случайных чисел начальное число. Это можно сделать, используя текущее время, так как мы надеемся, что это какой-то случайный случай.

#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
    int  r;
    srand(time(0));
    r = rand();
    return 0;
} 
8
ответ дан 28 November 2019 в 21:10
поделиться

Функция 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 содержит очень хорошую информацию о генерации псевдослучайных чисел.

3
ответ дан 28 November 2019 в 21:10
поделиться

Генераторы псевдослучайных чисел берут начальное число или начальное число, а затем генерируют следующее число в последовательности из этого. Вот почему они называются псевдослучайными, потому что, если они всегда используют одно и то же начальное значение, они будут генерировать ту же последовательность чисел, что и стандартный генератор C языка lib. Это можно исправить, задав для генератора начальное значение, которое изменится при следующем запуске программы, как текущее время.

В любом случае, код, который вы ищете, как сказали другие:

srand(time(0)); //Seed the generator, give it a starting value
1
ответ дан 28 November 2019 в 21:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: