В каждом языке программирования существует функция генерации случайных чисел. Они используются в различных областях, от игр до криптографии или генерации паролей.
На языке Python вывести случайное число можно так:
import random
print(random.randint(0, 9))
Но как это работает? Задача вывода действительно случайного числа далеко не так проста как кажется. Чтобы вывести что-то на компьютере, это что-то надо сначала запрограммировать. Но очевидно, что задать формулой случайный, хаотический процесс, невозможно — по определению формула и хаос противоречат друг другу. Именно поэтому числа на самом деле являются псевдослучайными — они лишь похожи на случайные, а в реальности являются результатом вполне конкретного алгоритма.
Одним из наиболее популярных и простых алгоритмов, является линейный конгруэнтный метод (linear congruential generator). Его формула проста:
Рассмотрим пример реализации на языке Python:
x = 123456789
m = 2**31 - 1
for p in range(10):
x = (1103515245 * x + 12345) % m
print(x)
Программа действительно выводит числа, которые вполне похожи на случайные: 295234770, 465300796, 1475666158, 588454008, 929838277, 50298429, 1089988954, 698778454, 2010473888, 36125306. Как нетрудно догадаться, при повторном запуске программы числа будут одни и те же. Чтобы числа не повторялись, такой генератор обычно инициализируют значением текущего системного времени.
Увы, такой генератор имеет определенные недостатки: во-первых, его последовательность рано или поздно начинает повторяться, во-вторых, он не является криптостойким — зная текущее значение, можно вычислить следующее, что к примеру, может позволить злоумышленнику узнать «случайно» сгенерированный пароль по его первым буквам.
Существуют другие алгоритмы генерации псевдослучайных чисел, например на основе простых чисел Мерсенна (Mersenne Twister generator). Существуют также аппаратные генераторы случайных чисел, например такая функция присутствует в процессорах Intel. Есть даже сайт , с помощью которого можно сгенерировать случайную последовательность чисел. По заверениям авторов, они используют 3 радиоприемника, настроенных на частоту шума атмосферных помех.
Разумеется, в большинстве обычных программ, например при написании компьютерной игры, «качеством» случайных чисел можно пренебречь, встроенные алгоритмы вполне неплохи. Но при разработке специализированного ПО, где вопрос криптостойкости имеет значение, стоит уже обратить внимание на то, насколько надежен применяемый алгоритм.