Как rand() генерирует последовательность случайных чисел из одного семени?
В цикле достаточно установить начальное значение один раз, чтобы получить последовательность случайных чисел. Как функция rand генерирует много случайных чисел, основываясь только на одном семени?
2 ответа
Все, что вам нужно, это алгоритм, чтобы превратить одно число в два числа. Один номер становится вашим следующим выходом, другой становится вашим следующим семенем. Такие алгоритмы довольно просты. Например, вы могли бы умножить число на два разных простых числа и затем уменьшить каждый мод на 65536. Это дало бы два выхода из одного входа.
Альтернативный метод еще проще:
1) Переставьте семя, умножив его на одно число и добавив второе число. (Например, seed = seed * 214013 + 2531011;
.)
2) Вывести только часть нового семени. (Например, return (seed >> 16) &0x7ffff;
.)
Это на самом деле псевдослучайный, числа кажутся случайными, но не являются, они являются детерминированными, так как они могут быть предсказаны алгоритмом. По-настоящему случайное число не может быть предсказано. Использование одного и того же семени приведет к той же последовательности. Стандарт определяет и алгоритм, но фактический используемый алгоритм будет зависеть от реализации.