Наверняка на многих сайтах, связанных с азартными играми и основанными на случайности, вас уверяли в том, что все числа генерируются случайно. Иногда говорят, что используют на сайты типа random.org, который, кстати, генерирует даже не псевдослучайные числа (что это такое ─ обсудим чуть ниже). И тут стоит сказать, что все это в большинстве случаев ─ чистая правда. Но ведь тогда владельцы подобных сайтов не получат никакой прибыли, должны же они как-то контролировать игру, так ведь? На самом деле, никто на числа прямо во время их генерации не влияет, все происходит еще до появления первого числа. Как? Чистая математика и немного программирования.
Для начала разберемся с тем, какова должна быть последовательность чисел, чтобы мы могли считать ее случайной. Есть три критерия:
- Равномерность
- Независимость
- Стохастичность
Стохастичность назовем просто случайностью, хоть и с точки зрения теории вероятности это грубая ошибка. Но в науку с ее точными определениями вам углубляться, скорее всего, не очень интересно. Независимость гарантирует то, что любое число никак не зависит от предыдущих и не влияет на последующие. А вот о равномерности следует поговорить поподробнее, потому что именно она и нарушается в "честной" генерации чисел.
Равномерность
Равномерность ─ это когда все числа, которые когда либо встречались в последовательности, появляются примерно одинаковое количество раз. Попробуем сгенерировать большую последовательность целых чисел от 1 до 10 и построить по этой последовательности гистограмму. Например, если у числа 6 столбик высотой 0.5, то это означает, что число 6 встречается в последовательности с частотой 0.5 (50%). Более простым языком, наша последовательность наполовину состоит из шестерок.
Видно, что каждое число составляет примерно десятую часть последовательности ─ равномерность соблюдена. А теперь посмотрите на еще одну гистограмму.
Распределение смещено влево, некоторые элементы вообще "выпрыгивают" из общей массы, непохоже на равномерную последовательность, правда? А это коэффициенты, взятые с одного из сайтов, о которых мы говорили в начале. Теперь попробуем повторить что-то подобное.
Создаем свой рандом
В данном коде мы снова генерируем случайные числа от 1 до 10, только теперь производим с ними абсолютно странные математические вычисления, объединяем в одно число и получаем вот такую гистограмму:
Вот теперь, основываясь на абсолютно настоящем рандоме, мы получили неравномерную последовательность. Вообще, если рассматривать все честно, то основывались мы на генераторе псевдослучайных чисел, хоть в данной задаче это и не особо важно. Разница в том, что псевдослучайные числа зачастую генерирует машина и их иногда можно предсказать, а случайные числа генерирует сама природа (помните random.org в самом начале статьи? Он использует атмосферные шумы для воспроизведения чисел).
При желании можно воссоздавать именно те распределения, которые нужны вам, но этот вопрос очень сложный и выходит за рамки данной статьи. Если интересно, то подробнее о задании распределений рассказано в этой статье на Хабре.
Вывод
Теперь вы знаете, как вам не договаривают, когда заявляют про настоящий и "честный" рандом. Помните, что сайты, содержащие такие обещания часто направлены на получение дохода, а значит распределение вроде бы и действительно случайной последовательности уже задано и явно отличается от равномерного. Не дайте себя обмануть и изучайте IT!