Глава 5 · Давайте поиграем с числами!

seed и воспроизводимость

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

seed() — задаём начальное состояние генератора

Раз псевдослучайный генератор — это формула с состоянием, то, задав одно и то же начальное состояние («зерно», seed), можно заставить его выдать ровно ту же последовательность чисел снова:

seed.py
import random

random.seed(42)
print(random.randint(1, 100))   # всегда одно и то же число при seed(42)

random.seed(42)                 # сбрасываем состояние заново
print(random.randint(1, 100))   # то же самое число, что и в первый раз
Зачем это нужно на практике
Воспроизводимость критична при отладке: если баг проявляется только «иногда», random.seed() позволяет зафиксировать конкретную «случайную» последовательность и повторно воспроизвести баг столько раз, сколько нужно для его исправления. Она же используется для автоматической проверки практик этой главы — без фиксированного seed автоматически проверить случайный результат было бы невозможно.

Независимые генераторы: random.Random()

Все функции модуля random, которые мы использовали, работают с одним общим, «глобальным» генератором. Если нужен отдельный, независимый генератор — например, чтобы одна часть программы не влияла на случайность другой — можно создать собственный экземпляр:

random_instance.py
import random

generator_a = random.Random(1)
generator_b = random.Random(1)

print(generator_a.randint(1, 100))   # оба генератора созданы с одним и тем же seed —
print(generator_b.randint(1, 100))   # значит, дадут одинаковый результат независимо друг от друга

random — это не безопасно для паролей и ключей

Раз randomпредсказуемый генератор (тот же seed → та же последовательность), его нельзя использовать там, где случайность защищает от взлома: пароли, токены сессий, ключи шифрования. Для этого в стандартной библиотеке Python есть отдельный модуль — secrets, спроектированный именно для безопасности, а не для скорости.

random или secrets?
Нужна случайность для игры, симуляции, тестового примера?
используйте random
Нужна случайность для пароля, токена, ключа безопасности?
используйте secrets
random оптимизирован для скорости и предсказуемости при том же seed — это НЕ подходит для защиты данных
secrets_primer.py
import secrets

token = secrets.token_hex(16)   # криптографически надёжный случайный токен
print(token)
Мы не будем глубоко изучать secrets в этой главе
Достаточно запомнить сам принцип: random — для игр, симуляций и учебных задач; secrets — там, где случайность защищает что-то ценное. Подробнее о безопасности мы поговорим в более поздних главах.
Практика: seed и воспроизводимость
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки
Открыть практику →