Как функция srand взаимодействует с функцией времени?

Я очень запутался — у меня есть следующий код — min и max — наши значения диапазона.
Насколько я понимаю, функция srand принимает значение — начальное значение и возвращает псевдослучайное целое число. Во-первых, что такое псевдослучайное целое число?

// Constants
const int MIN = 50;
const int MAX = 450;

// Get the system time.
unsigned seed = time(0);

// Seed the random number generator.
srand(seed);

// Generate two random numbers.
int num1 = MIN + rand() % MAX;
int num2 = MIN + rand() % MAX;

Также нам нужно инициализировать значение времени? мы можем просто вызвать функцию времени?
Я считаю, что функция времени возвращает что-то вроде неполных секунд — создавая наш случайный #?
Я вообще запутался, как генерируется случайный #.

Спасибо

1

Решение

«Псевдослучайное целое число» означает, что оно сгенерировано из функции (так что, теоретически, оно предсказуемо), но было бы нелегко отличить выходное значение от действительно случайного значения (например, если обезьяна берет одно из чисел 0-9 из сумки и выбрасывает ее потом). Конечно, в зависимости от того, насколько хороша псевдослучайная функция. Стандарт C / C ++ rand() между прочим, недостаточно для «серьезных» криптовалют.

Если вы не инициализируете srand с семенем вы всегда будете получать одинаковую последовательность выходных значений от генератора чисел. Значение времени используется из-за предположения, что часть «частичных секунд» будет относительно случайной (и ее относительно дешево получить).

5

Другие решения

Это способ гарантировать, что вы получаете различную последовательность случайных чисел с каждым прогоном, так как (предположительно) time () будет иметь различное значение с каждым прогоном; Вы можете (слишком упрощенно) думать о семени как о начальной точке этой последовательности.

2

Псевдослучайные числа являются детерминированными (т.е. не-случайная) последовательность значений производится алгоритмически. Исторически сложилось так, что обычным способом сделать это было использование простых рекуррентных отношений: Uя = f (Uя-1), где Uяэто целочисленные значения. Мгновенное размышление говорит вам, что, как только вы увидите дублирующее значение для U, все последующие значения также будут дубликатами. Это означает, что последовательность циклов. Хороший генератор — это тот, где U кажутся некоррелированными, равномерно распределены по диапазону целых чисел и имеют большую длину цикла. Посев генератора состоит из выбора точки входа в цикл. Если вы всегда выбираете одну и ту же точку входа, вы всегда получите одну и ту же последовательность. Если вы явно не выберете начальное состояние (начальное значение), тогда большинство PRNG имеют инициализацию по умолчанию.

За прошедшие годы было признано, что рекуррентные функции, которые были распространены в 1950–1980-х годах, имели множество проблем, которые позволяли легко отличить их от истинной случайности. Более современные генераторы используют большее пространство состояний, чем одно целое число, и проецируют многомерное пространство до одного целочисленного вывода при каждом вызове. Это означает, что вы можете получить отдельные повторения значений, но не получите повторение последовательности, пока не вернетесь в то же пространство состояний, из которого начали. Поскольку пространства состояний растут в геометрической прогрессии по количеству битов, это дает намного более длинные используемые последовательности. Посев по-прежнему состоит из инициализации пространства состояний.

2

Насколько я понимаю, функция srand принимает значение — начальное значение и возвращает псевдослучайное целое число.

Почти, но не совсем. Он просто устанавливает семя и возвращает пустоту. rand возвращает псевдослучайное целое число

Во-первых, что такое псевдослучайное целое число?

Целое псевдослучайное число является интегральным выходом генератора псевдослучайных чисел. Генератор псевдослучайных чисел — это алгоритм, который генерирует последовательность поверхностно случайных чисел.

Также нам нужно инициализировать значение времени? мы можем просто вызвать функцию времени?

Нет необходимости инициализировать что-либо для вызова time функция.

Я считаю, что функция времени возвращает что-то вроде неполных секунд

Не частично. Возвращает количество секунд с начала эпохи.

Для получения дополнительной информации обратитесь к справочной документации:

Для получения основной информации о генераторах псевдослучайных чисел см., Например, wikipedia: http://en.wikipedia.org/wiki/Pseudorandom_number_generator

2
По вопросам рекламы [email protected]