Мы учимся доверять абстракциям, которые используем для программирования, и иногда не задумываемся о том, что происходит на более низком уровне. Одна функция, которую я использую очень часто и не могу понять, — это случайный метод. Вы берете набор вещей и получаете результат, который предположительно является случайным; и мы довольны этим. То, что это непредсказуемо для пользователя, не означает, что это действительно случайно, нам достаточно просто принять это. Итак, мой первый вопрос: что происходит под случайными функциями и действительно ли это случайно? Если нет, то как мы можем сделать функцию действительно случайной?
Случайная функция, как и любая другая программа, представляет собой набор процедур, которые дают вам результат. Это означает, что кто-то написал инструкции для этого метода, чтобы сделать выбор. Компьютерные программы по своей природе детерминированы, так как же возможно написать программу, которая не является детерминированной. Эта проблема может быть (почти) решена с помощью алгоритма, зависящего от реализации; алгоритм, зависящий от фактора (переменной), определяемого в момент реализации (запуска программы). Ruby, например, запустит свой алгоритм, используя комбинацию чисел с вашего компьютера, таких как время, идентификатор процесса и порядковый номер (если на вашем компьютере нет криптографического провайдера, предоставляющего номер для заполнения). Это заставит алгоритм давать результаты, которые кажутся неопределенными.
С алгоритмом, который уникален еще более уникальным начальным числом, мы можем все ближе и ближе приближаться к истинной случайности, но важно отметить, что это все еще не настоящая случайность. Чем сложнее начальное число, тем экспоненциально мы приближаемся к случайному, но оно никогда не будет по-настоящему случайным, а только псевдослучайным. Чтобы максимально приблизиться к случайному, нам нужно сгенерировать начальное число из полностью динамического, уникального и непредсказуемого источника. Атмосферный шум считается лучшим источником чего-то уникального и неопределенного, и Random.org использует его для создания того, что они называют истинной случайностью. Называть это истинной случайностью зависит от того, является ли сама Вселенная детерминированной или хаотической системой. Если вселенная функционирует процедурно и все определяется обстоятельствами, то атмосферный шум порождает случайность, как и наша временная метка, только более сложная. Это означало бы, что каждый доступный нам источник бесконечно приближал бы нас к истинной случайности, но не к истинной случайности. Если Вселенная — это хаотическая система, а атмосферный шум неопределен и уникален в каждый данный момент времени, то мы получили генератор случайных чисел.
Ресурсы моего безумия:
- http://stackoverflow.com/questions/20109006/how-does-math-random-work-in-javascript?answertab=votes#tab-top
- https://en.wikipedia.org/wiki/Mersenne_Twister
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random
- https://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator
- https://en.wikipedia.org/wiki/Детерминированная_система
- http://ruby-doc.org/core-2.2.0/Random.html#method-c-srand
- https://msdn.microsoft.com/en-us/library/windows/desktop/bb931357(v=vs.85).aspx
- https://en.wikipedia.org/wiki/Псевдослучайность
- https://www.random.org/randomness/