Как rand() генерирует последовательность случайных чисел из одного семени?

В цикле достаточно установить начальное значение один раз, чтобы получить последовательность случайных чисел. Как функция rand генерирует много случайных чисел, основываясь только на одном семени?

2 ответа

Решение

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

Альтернативный метод еще проще:

1) Переставьте семя, умножив его на одно число и добавив второе число. (Например, seed = seed * 214013 + 2531011;.)

2) Вывести только часть нового семени. (Например, return (seed >> 16) &0x7ffff;.)

Это на самом деле псевдослучайный, числа кажутся случайными, но не являются, они являются детерминированными, так как они могут быть предсказаны алгоритмом. По-настоящему случайное число не может быть предсказано. Использование одного и того же семени приведет к той же последовательности. Стандарт определяет и алгоритм, но фактический используемый алгоритм будет зависеть от реализации.

Другие вопросы по тегам