Как работает random()?

Каждый язык имеет функцию random() или что-то подобное для генерации псевдослучайного числа. Мне интересно, что происходит, чтобы генерировать эти цифры? Я не программирую ничего, что делает эти знания необходимыми, просто пытаясь удовлетворить свое любопытство.

Ответ 1

Вся первая глава Дональда Кнута  work Семинумерные алгоритмы рассматриваются с вопросом о генерации случайных чисел. Я действительно не думаю, что ответ SO будет близок к описанию затронутых вопросов. Прочтите книгу.

Ответ 2

страница Википедии является хорошей ссылкой.

Фактический используемый алгоритм будет зависеть от языка и реализации языка.

Ответ 3

На удивление легко получить полуподобные псевдослучайные числа. На протяжении десятилетий золотой стандарт представлял собой удивительно простой алгоритм: сохранить состояние x, умножить на константу A (32x32 = > 64 бит), затем добавить константу B, а затем вернуть низкие 32 бита, которые также станут новым x. Если A и B выбраны тщательно, это действительно работает достаточно хорошо.

Псевдослучайные номера также должны быть повторяемыми, чтобы воспроизводить поведение во время отладки. Таким образом, выселение генератора (инициализация x с помощью, скажем, времени суток) обычно устраняется во время отладки.

В последние годы и с большим количеством вычислительных циклов, доступных для записи, доступны более сложные алгоритмы, некоторые из которых были изобретены с момента публикации вполне авторитарных Seminumerical Algorithms. Операционные системы также начинают предоставлять аппаратные и сетевые биты энтропии для специализированных криптографических целей.

Ответ 4

random() - это так называемый генератор псевдослучайных чисел (PRNG). random() в основном реализуется как линейный конгруэнтный генератор. Это функция вида X (n + 1) (aXn + c) по модулю m. Xn - последовательность порожденных псевдослучайных чисел. Генетическая последовательность чисел легко угадывается. Этот алгоритм не может использоваться как криптографически безопасный PRNG.

Википедия: линейный конгруэнтный генератор

И взгляните на тесты на ППНГ Тесты PRNG Diehard

Ответ 5

Чтобы точно ответить вам, случайная функция предоставляется операционной системой (обычно).

Но то, как операционная система создает эти случайные числа, является специализированной областью в информатике. См., Например, страницу вики, размещенную в ответах выше.

Ответ 6

Одна вещь, которую вы, возможно, захотите изучить, - это семейство случайных устройств, доступных на некоторых Unix-подобных операционных системах, таких как Linux и Mac OSX. Например, в Linux ядро ​​собирает энтропию из разных источников в пул, который затем использует, чтобы засеять его генератор псевдослучайных чисел. Энтропия может исходить из множества источников, наиболее заметным из которых является дрожание драйвера устройства от нажатия клавиш, сетевых событий, активности на жестком диске и (более всего) движений мыши. Кроме того, существуют другие методы сбора энтропии, некоторые из них даже полностью реализованы в аппаратных средствах. Есть два символьных устройства, на которые вы можете получить случайные байты и из Linux, они ведут себя следующим образом:

  • /dev/urandom дает вам постоянный поток байтов, который является очень случайным, но не криптографически безопасным, поскольку он повторно использует любую энтропию, доступную в пуле.
  • /dev/random дает криптографически безопасные случайные числа, но он не даст вам постоянного потока, поскольку он использует энтропию, доступную в пуле, а затем блокирует, пока собирается больше энтропии.

Обратите внимание, что, хотя Mac OSX использует для него другой метод PRNG и поэтому не блокирует, мои личные тесты (сделанные в колледже) показали, что они кажутся немного менее случайными, чем ядро ​​Linux. Конечно, достаточно хорошо.

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