Казалось бы, сгенерировать рандомное число - одна из самых простых вещей, что может компьютер. В любом языке программирования на генерацию рандомного числа уйдёт не более одной строчки кода. А вы когда-нибудь задумывались о том, как компьютер вообще генерирует рандомные числа? Откуда он их берёт? Давайте разбираться!
Попробуйте сами придумать число. Скорее всего, вы загадаете небольшое двух- или трёхзначное число. Чтобы не напрягаться, все цифры в вашем числе стоят где-то посередине относительно ряда 0-9. Например, вы загадали число 46 — обе цифры 4 и 6 находятся в середине числового ряда 0,1,2…9,10.
Возможно число, которое вы загадали, с чем-то связано. Например, оно взято из даты вашего рождения или это номер вашей машины или просто ваше любимое число. Но было ли это рандомно?
Что вообще такое рандом?
Вы слышали выражение «псевдорандомное число». Вы спросите: «почему ‘псевдо’? Неужели это какое-то не до конца рандомное число?». На самом деле так и есть. Суть в том, что псевдорандомным называется то, что генерируется случайным образом, но при этом, если постараться, можно предугадать результат.
К примеру, возьмём монетку. Если её подбросить, с какой вероятностью выпадет решка? Будет ли это случайностью? На самом деле, если постараться, теоретически можно предугадать, какой стороной упадёт монетка, если расчитать её массу, силу толчка, расстояние до земли, плотность воздуха и ряд других параметров. Это и есть превдорандомность.
А что такое абсолютный рандом? На самом очень представить что-то абсолютно случайное, что невозможно предсказать или повлиять на исход. Разве что можно представить игру в футбол. Там никто не знает чья команда победит, т.к. можно расчитать упругость мяча, расстояние до ворот и прочее, но невозможно расчитать с какой силой и в каком направлении футболист направит мяч. Выходит — исход игры в футбол — это и есть рандомность.
Способы генерации рандомных и псевдорандомных чисел
Если рассматривать компьютер, то в каждой операционной системе лежат разные способы генерации псевдорандомных чисел. Чаще всего это смесь каких-нибудь системных значений; например системного времени (которое изначально измеряется в количестве миллисекунд, прошедших с полуночи 1 января 1970 года). (Более подробно об этом на Википедии), координат курсора мыши, буфера обмена, «выхлопа» запущенных процессов и т.д.
В UNIX-системах есть два системных файла (стрима, потока): /dev/random и /dev/urandom. Один из этих файлов выдаёт непрерывный, нескончаемый поток случайных байтов, сформированный самой системой из того, что есть. Другой же, более рандомный, выдаёт поток байтов на основании действий пользователя: движений мыши, нажатий кнопок на клавиатуре и т.д.. Такой способ считается более рандомным и часто используется, например, при генерации ключей шифрования.
При генерации рандомных данных часто используется сид (seed). Это небольшой кусок данных, который подмешивается в алгоритмы при генерации рандомного числа, чтобы оно получилось ещё более рандомным.
Самое, наверное, популярное и очевидное использование сида — это игра Minecraft. В неё играли очень многие, а слышали о ней практически все.
При запуске новой игры, игрок может указать seed, который будет использоваться для генерации нового мира. Если в этой игре даже на разных компьютерах и без интернета указать один и тот же seed, мы получим две полностью одинаковые копии мира.
Пара слов о random.org
Самый знаменитый и авторитетный ресурс по генерации рандомных чисел random.org предлагает любому желающему получить максимально рандомное число.
Данный ресурс генерирует рандомные числа на основании атмосферных шумов. О том, что такое атмосферный шум, цитата из английской википедии:
Источник: https://en.wikipedia.org/wiki/Atmospheric_nois
Атмосферный шум — это радиошум, вызванный естественными атмосферными процессами, в первую очередь грозовыми разрядами во время грозы. В мировом масштабе происходит около 40 вспышек молний в секунду — ≈3,5 миллиона разрядов молний в день.
То есть random.org специально анализирует данные об атмосферных шумах и прогоняет их через свои алгоритмы ради того, чтобы сгенерировать вам число. На random.org даже есть ограничение на генерацию рандомных чисел с одного IP. Ограничение работает не на количество чисел, а на количество выданных бит (1 000 000). (Ссылочка с подробностями на этот счёт). random.org берёт определённое количество бит для генерации чисел в разных диапазонах. Например, генерация числа от 1 до 100 занимает 7 бит. То есть вы сможете 142857 раз сгенерировать число от 1 до 100. random.org начисляет вам 200 000 бит каждые сутки (по UTC), либо можно докупить биты.