Подтвердить что ты не робот

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

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

У меня

#include <cstdlib> 

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

randomDiceRollComputer = 1 + rand() % 6;
4b9b3361

Ответ 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