Привет, Хаброжители! У нас вовсю продолжается распродажа «Старый Новый год».

Кто пытается арифметическими методами генерировать случайные числа, тот, конечно, живет во грехе. Поскольку, как указывалось уже неоднократно, нет такого феномена, как случайное число  —  есть только методы для получения случайных чисел.

– Джон фон Нейман

Генераторы случайных чисел (ГСЧ) – важнейшая составляющая разнообразных процессов, связанных с компьютерными программами, таких как криптография, моделирование, машинное обучение, игры, программирование, азартные игры, научные исследования – список можно продолжать. Но может возникнуть вопрос: как именно получить по-настоящему случайное значение, и почему это важно?

Оказывается, спонтанность — не самая сильная сторона компьютеров. Они
могут выполнять только те действия, на которые запрограммированы. Благодаря
ГСЧ, компьютеры приобретают способность генерировать уникальные неравномерно
распределенные числа. Иными словами, ГСЧ помогает компьютеру моделировать
непредсказуемость.

Два типа генераторов случайных чисел

Генераторы случайных чисел бывают двух разных типов: генераторы истинно случайных чисел (ГИСЧ) и генераторы псевдослучайных чисел (ГПСЧ) [1]. ГИСЧ считаются «истинными», так как используют в качестве источника энтропии внешний источник, расположенный за пределами компьютерной программы – например, погоду, атмосферные помехи или промежутки времени, в течение которых вы удерживаете клавиши на клавиатуре вашего компьютера.

Более строгие научные методы связаны с измерением радиоактивного распада атома [2]. Согласно квантовой теории, невозможно узнать наверняка, когда произойдет акт деления ядра, так что это, в сущности, «чистая случайность». Генерация истинно случайных чисел – это по-настоящему захватывающая тема, и мы посвятили ей целую статью, которая находится здесь.

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

Генерация псевдослучайных чисел (синий) и генерация истинно случайных чисел (белый)
Генерация псевдослучайных чисел (синий) и генерация истинно случайных чисел (белый)

Генераторы псевдослучайных чисел

Кажется, что ГПСЧ генерируют случайные числа, но на самом деле это только кажется [3]. Они сравнительно широко используются благодаря своей скорости и воспроизводимости результатов, поэтому они очень хорошо подходят для применения при моделировании и в играх. В сущности, ГПСЧ – это алгоритмы, использующие математические формулы или просто предвычисленные таблицы для выдачи последовательностей чисел [4]. Возьмем, к примеру, линейный конгруэнтный генератор (ЛКГ). В его составе используется начальное значение, множитель, инкремент и модуль.

В ЛКГ для запуска алгоритма используется одиночное начальное значение. ЛКГ решает такое уравнение: (seed * multiplier + increment) mod m = output
В ЛКГ для запуска алгоритма используется одиночное начальное значение. ЛКГ решает такое уравнение: (seed * multiplier + increment) mod m = output

Рано или поздно, после некоторого количества попыток, последовательности начнут повторяться. Эта величина называется «период» и является мерой количества уникальных чисел в последовательности. ЛКГ не используются при шифровании, поскольку не обеспечивают достаточно надежной случайности. У них короткие периоды, а их паттерны равномерны.

В основе большинства ГПСЧ для шифрования лежит Вихрь Мерсенна. Этот генератор псевдослучайных чисел был разработан в 1997 году Макото Мацумото и Такудзи Нисимура и в настоящее время является наиболее распространенным неспециализированным ГПСЧ [5]. Назван он так потому, что имеет период 2¹⁹⁹³⁷− 1, такова длина простого числа Мерсенна. Вихрь Мерсенна по умолчанию используется во многих программных системах, в частности, в Microsoft Excel, MATLAB, Free Pascal, PHP, Python, R, Ruby и C++. Также он обычен в играх. К нему прибегают во многих системах, так как он позволяет быстро генерировать высококачественные псевдослучайные числа.

Способы использования игр

По мере того, как компьютерные игры становятся все реалистичнее, растет потребность и в более качественных генераторах случайных чисел. Сейчас ГПСЧ используются для создания геймплея, графики и обеспечения многих аспектов разработки игр. Когда ваш персонаж бьет противника, в игре требуется случайное число, чтобы аппроксимировать разброс нанесенного ущерба. В игре с ультрареалистичной графикой ГСЧ делегируется имитация отражений света, чтобы не перенапрягать процессор. В Minecraft случайное начальное значение используется для процедурной генерации мира вокруг вашего персонажа.

Игры такого типа, основанные на так называемой «процедурной генерации», в последние годы приобрели большую популярность. Причина проста: в них не приходится все делать вручную. Процедурный генератор – это система, использующая ГСЧ для создания целого мира по чисто случайному принципу [6]. В случае с “No Man’s Sky” в игре генерируется целая Вселенная. Процедурная генерация позволяет очень сильно экономить память, в то же время создавая почти неограниченное количество игровых локаций и персонажей. Без ГСЧ сделать это было бы просто невозможно, поскольку слишком сильно затрачивались бы ресурсы, и на большинстве устройств игра бы подвисала.

Конечно, здесь есть и недостатки. Для генерации каждой планеты в “No Man’s Sky” используется 64-разрядное начальное значение. Это число скармливается генератору биомов для создания ландшафта и других разнообразных атрибутов планеты. Но 64-разрядного числа в данном случае недостаточно, поэтому планеты не отличаются существенным разнообразием.

Порождающая последовательность запускается в игре всякий раз, когда вы входите в новую звездную систему [7]. Сначала вы видите большие разнообразные планеты с голубыми океанами и пышными зелеными лесами. Как только вы приступаете к исследованию планет, начинают вырисовываться различные варианты окружающей среды. Избыточные ландшафты и животные равномерно распределяются по поверхности планеты, и закономерности становятся очевидными.

С технической точки зрения, эти планеты получаются методом генерации случайных чисел, но ни одна из них не оставляет по-настоящему уникального впечатления. Игра может справляться только с небольшой вариативностью окружающей среды, отчасти из-за ограничений того ГПСЧ, который в ней используется. Чтобы справиться с такой дилеммой, нужен генератор случайных чисел с более длинным случайным значением. Если увеличить длину начального значения, получим больше переменных, но одного лишь этого будет мало. Один из атрибутов случайности заключается и в дисперсии чисел. Вы не хотите, чтобы одно и то же число попалось вам двенадцать раз подряд. Случайность получается и из того, насколько неравномерно распределены последовательности чисел. Вот почему фактор случайности так важен в играх.

Равномерность распределения псевдослучайных чисел можно проверить при помощи симуляции по методу Монте-Карло [8]. Методы Монте-Карло – это тип алгоритмов, которые раз за разом делают случайную выборку для получения численного результата. Их основная идея – в решении задач методом подбора случайных значений.

Оценка значения числа Пи методом Монте-Карло
Оценка значения числа Пи методом Монте-Карло

Обычно они используются для оценки неизвестных соотношений и областей. На рисунке выше метод Монте-Карло применяется для оценки значения числа Пи. Чтобы методы Монте-Карло были эффективны, в них не обязательно требуются истинно случайные числа. Часто при помощи детерминированных псевдослучайных последовательностей оказывается просто тестировать и повторно прогонять симуляции [9]. Рассмотрим, например, как робот-пылесос Roomba ориентируется по плану комнат в доме.

Роботы-уборщики наподобие Roomba используют для навигации безмодельный фреймворк машинного обучения [10]. Таким образом, они учатся методом проб и ошибок: вы формулируете роботу, какую цель нужно достичь, но не предоставляете ему конкретного плана действий.

Пылесос Roomba 980 строит карту «окрестностей», прибираясь в доме
Пылесос Roomba 980 строит карту «окрестностей», прибираясь в доме

Tакой безмодельный фреймворк использует симуляцию по методу Монте-Карло, чтобы смоделировать планировку дома. Вместо того, чтобы просто покрывать всю возможную площадь дюйм за дюймом, он случайным образом выбирает точки, которые нужно найти, и так уточняет планировку. Входящие данные от сенсоров он использует, чтобы проверить, обошел ли уже весь пол. Закончив поиски, он возвращается в точку, которая соответствует началу координат.

Рандомизация домена (DR) – еще один способ использования случайности в машинном обучении. DR – это фреймворк машинного обучения, основанный на моделях. В нем применяется фиксированный набор правил, по которым учится ИИ [11]. Он используется в открытом проекте из области ИИ, связанном с моделированием ловкости рук.

Варианты манипуляций, автономно изученные роботом Dactyl
Варианты манипуляций, автономно изученные роботом Dactyl

Dactyl – это робот, обученный на множестве случайно подобранных симуляций, при помощи которых компьютер освоил естественные движения рук. Проект показал, что опыт обучения, заложенный в модель, составляет 100 лет. Машинное обучение такого рода было бы недостижимо, если бы учебные множества данных для него не генерировались при помощи ГСЧ.

Варианты использования в криптографии

Вы когда-нибудь задумывались, каковы механизмы шифрования в ваших полях с паролями и в браузере? Вы догадались: в основе цифрового шифрования лежат случайные числа [12]. Всякий раз, когда ваш браузер пытается обратиться за онлайновой информацией, она шифруется по методу SSL, что означает «слой защищенных сокетов».

Процесс начинается так:

  • Сначала ваш браузер запрашивает идентификатор сервера.

  • Затем веб-сервер направляет вашему браузеру в ответ на этот запрос SSL-сертификат.

  • Браузер/сервер проверяют, можно ли доверять SSL-сертификату. Если можно, то на веб-сервер отправляется соответствующее сообщение.

  • Веб-сервер отправляет обратно подтверждение, снабженное цифровой подписью и позволяющее начать сеанс, зашифрованный по технологии SSL.

  • Зашифрованные данные совместно используются браузером/сервером с одной стороны и веб-сервером с другой стороны.

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

История тайн

Использование фактора случайности для шифрования сообщений восходит ко временам древнего Рима. Римляне использовали шифр Цезаря, чтобы зашифровывать военные сообщения случайным ключом. В перемешивании для такого шифра использовалось всего 26 букв, поэтому вероятность взломать его составляла 1/26. Враг мог путем перебора попробовать все буквы латинского алфавита, и в таком случае на взлом кода ушло бы несколько часов, но к тому времени зашифрованные приказы уже были бы неактуальны.

Шифр Цезаря
Шифр Цезаря

По стандартам современной криптографии используется так называемая система одноразовых блокнотов. При использовании этого метода каждый символ в сообщении заменяется случайной буквой. Такой подход значительно снижает вероятность, что сообщение будет расшифровано. Допустим, вы хотите зашифровать имя “Alice”:

При рандомизации каждого символа в сообщении сложность его расшифровки возрастает экспоненциально. В случае с “Alice”, как в вышеприведенном примере, вероятность расшифровать это слово с первой попытки составляет около одного к 12 миллионам (26*26*26*26*26). Чем длиннее ключ, тем сильнее шифр.

Если вас интересует по-настоящему сложное шифрование, обратите внимание на SHA-256 [13]. SHA означает “Secure Hash Algorithm” (алгоритм криптографического хеширования). Он обычен в блокчейнах. Хеш-функция – это тип математической функции, преобразующей данные в отпечаток, именуемый «хеш-значением». Хеш-алгоритм – это функция, принимающая входные данные и преобразующая их в вывод фиксированной длины. Хеш-функция однонаправленная. Невозможно обратить данные из ее хеша; можно пройти путь от входных данных до хеша, но не наоборот.

У SHA-256 2^256 возможных исходов. Это число невероятно велико. Если бы все компьютеры на планете были задействованы для расшифровки всех возможных сигнатур этого сообщения, то на эту работу потребовался бы срок, в 37 раз превышающий возраст Вселенной. SHA-256 – основа защиты большинства блокчейнов, а также стандартный метод шифрования в АНБ и ЦРУ. Это одна из причин, по которым с технологиями блокчейна связаны такие большие ожидания.

Заключение

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

Источники

[1] Haahr, M. Introduction to Randomness and Random Numbers.

[2] John Walker, (1996). HotBits: Genuine random numbers, generated by radioactive decay.

[3] Christophe Dutang.,Diethelm Wuertz. (2009). A note on random number generation.

[4] Dave Ackley (2013). NMCS4ALL: Random number generators.

[5] Makoto Mastsumoto and Takuji Nishimura (1998).Mersenne Twister: A 623-dimensionally equidistributed uniform pseudorandom number generator.

[6] gregkwaste (2016). No Man’s Sky – Procedural Content.

[7] gkhan.(2015). A Short History of Randomness in Games (or “Why No Man’s Sky is just a pretty Pitfall!”).

[8] Dirk P. Kroese. (2011).Monte Carlo Methods.

[9] Will Knight. (2015).The Roomba Now Sees and Maps a Home.

[10] Vitchyr Pong. (2018). TDM: From Model-Free to Model-Based Deep Reinforcement Learning.

[11] Open AI.(2018). Learning Dexterity.

[12] Entrust(2005). Understanding Digital Certificates and Secure Sockets Layer (SSL).

[13] 3Blue1Brown. (2017).How secure is 256 bit security?

Комментарии (13)


  1. v1000
    19.01.2022 10:58
    +1

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

    Как, например, во время первого вызова выдавать одно и то-же число.

    Потому что это для режима отладки.


  1. third112
    19.01.2022 12:13
    +1

    Тема очень актуальная. Станислава Лем целый роман на эту тему написал — «Голос неба».
    Но, к сожалению, в статье тема не раскрыта полностью. Так:


    ГИСЧ считаются «истинными», так как используют в качестве источника энтропии внешний источник, расположенный за пределами компьютерной программы – например, погоду, атмосферные помехи или промежутки времени, в течение которых вы удерживаете клавиши на клавиатуре вашего компьютера.

    ИМХО погода — не лучший источник. Все знают, что летом бывает жарко, а зимой холодно, за морозом будет оттепель. В менеджерах паролей используют закрашивание квадрата мышью. Это выглядит надежнее. В железе используют шум полупроводниковых диодов, что почти не хуже ядерной реакции. Но если детерминизм Лапса, которому философы пока не придумали строгого опровержения, верен, то с идеей абсолютно случайных чисел придется проститься ;)


    1. Keeper1
      19.01.2022 14:12

      Станислава Лем целый роман на эту тему написал — «Голос неба».

      Вы имели в виду "Глас Господа" (Głos Pana)?


      1. third112
        19.01.2022 14:29

        Да. Первоначально в переводе это был «Голос неба».


    1. Nacreous1991
      19.01.2022 14:24

      А при чем тут жарко и холодно. Десятые доли градуса за окном это практически случайная величина. Как и последняя цифра s&p 500


      1. foxairman
        19.01.2022 14:30

        Это получается можно s&p 500 использовать для генерации случайных чисел :)


      1. third112
        19.01.2022 14:32

        И что делать, если за долю секунды мне нужно 100 тысяч случайных чисел?


        1. prograholic
          19.01.2022 15:26

          Использовать значение ГИСЧ в качестве сида для ГПСЧ. Через определенное количество использований повторять такую процедуру


  1. lxsmkv
    19.01.2022 12:23

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

    Помню, когда в университете проходили алгоритмы сортировки я спросил преподавателя, мол, если есть алгоритмы сортировки, существуют ли алгоритмы с противоположным действием? И преподаватель только странно посмотрела на меня и спросила "А зачем?"


    1. unclejocker
      19.01.2022 13:04
      +1

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

      Или еще есть вариант для free-to-play: регулировать шансы по некоей эмпирической кривой, с одной стороны подводя к тому, что бы игрок задонатил, с другой - не доводя до того, чтобы бросил играть совсем.


  1. vitaliy31
    19.01.2022 14:43

    Имеет место распространенная путаница в различных понятиях, в обиходе называемых "случайностью":

    • случайность бытовая - синоним непредсказуемости;

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


  1. Revertis
    19.01.2022 18:01
    +1

    Если вас интересует по-настоящему сложное шифрование, обратите внимание на SHA-256 [13]. SHA означает “Secure Hash Algorithm” (алгоритм криптографического хеширования).

    SHA-256 – основа защиты большинства блокчейнов, а также стандартный метод шифрования в АНБ и ЦРУ.

    Кажется автор не понимает разницу в шифровании и хэшировании.


  1. Travisw
    19.01.2022 19:24

    Откуда данные про все компьютеры в мире считали бы обратный хэш 37 раз возрастов вселенной?