Являются ли числа, которые мы генерируем, действительно случайными?

Можем ли мы генерировать действительно случайные числа?

Введение

Всякий раз, когда нам нужен наш код для создания случайного числа, мы обычно вызываем метод из библиотеки, чтобы сгенерировать его для нас. Но действительно ли числа, сгенерированные из библиотеки, «случайны»? В этой статье мы рассмотрим случайный модуль Python.

Что значит быть действительно случайным?

Для начала мы должны определить, что значит быть действительно случайным. Чтобы сгенерировать действительно случайное число, генератор должен выбрать непредсказуемое число, в котором нет шаблона или последовательности событий, которым мы можем следовать, чтобы получить такое же «случайное» число. Другими словами, нам нужно, чтобы генератор был недетерминированным.

Псевдослучайные числа

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

Случайная библиотека Python

Далее давайте посмотрим на документацию встроенной в Python библиотеки Random.

Сразу же Python сообщает нам, что числа в названии являются псевдослучайными.

random — Сгенерировать псевдослучайные числа

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

Python использует Mersenne Twister в качестве основного генератора. Он производит 53-битные числа с плавающей запятой и имеет период 2**19937–1.

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

Ниже приведен Repl, который генерирует случайное число на основе начального числа «478».
Вы поймете, что нажатие на кнопку «Выполнить» всегда даст вам один и тот же результат, потому что одно и то же начальное число всегда будет возвращать вам одно и то же число. в генераторе псевдослучайных чисел.



Достаточно ли хороша псевдослучайность?

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

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

Другой пример: если бы мы играли в онлайн-игру в покер. Если бы игра генерировала предсказуемые случайные числа, мы потенциально могли бы написать программу для предсказания карт, которые будут сданы, если бы мы могли выяснить алгоритм и используемое начальное число.

Как мы можем генерировать действительно случайные числа?

Далее вам может быть интересно: возможно ли генерировать действительно случайные числа?
Чтобы генерировать действительно случайные числа, нам пришлось бы использовать внешнюю физическую переменную, которая непредсказуема. Он также известен как Аппаратный генератор случайных чисел.

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

Заключение

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