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

Одним из распространенных типов генераторов псевдослучайных чисел является линейный конгруэнтный генератор (LCG), который использует простую формулу для генерации следующего числа в последовательности:

X_(n+1) = (a * X_n + c) mod m

где:

  • X_(n+1) — следующее число в последовательности,
  • X_n — текущий номер,
  • a, c и m являются константами, а
  • mod - операция модуля.

Вот простой пример линейного конгруэнтного генератора:

def lcg(modulus, a, c, seed):
    """Linear congruential generator."""
    while True:
        seed = (a * seed + c) % modulus
        yield seed

# Create a generator
generator = lcg(modulus=9, a=2, c=0, seed=1)

# Generate some numbers
for _ in range(10):
    print(next(generator))

В этом примере генератор начинает с начального значения 1, затем повторно умножает текущее число на 2 и берет результат по модулю 9 для генерации следующего числа. Генерируемая при этом последовательность чисел (2, 4, 8, 7, 5, 1, 2, 4, …) кажется случайной, но на самом деле она полностью детерминирована.

Более сложным генератором псевдослучайных чисел, чем Linear Congruential Generator, является Mersenne Twister, который на самом деле является генератором случайных чисел по умолчанию в нескольких языках программирования, включая Python и R.

Вихрь Мерсенна имеет период 2¹⁹⁹³⁷-1 итерации (простое число Мерсенна, отсюда и название) и известен тем, что генерирует высококачественные псевдослучайные целые числа.

Вот пример того, как использовать Mersenne Twister в Python:

import random

random.seed(123456789)  # Sets the seed

# Generate some random numbers
for _ in range(10):
    print(random.randint(1, 100))

Этот код будет выводить одну и ту же последовательность чисел при каждом запуске из-за…