Глава 4 · Python любит числа

Случайные числа: random и secrets

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

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

random_demo.py
import random

print(random.randint(1, 6))   # случайное целое от 1 до 6 включительно
print(random.random())        # случайное число от 0.0 до 1.0
print(random.choice(["орёл", "решка"]))  # случайный выбор из списка

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

Иногда нужно, чтобы «случайная» последовательность повторялась — например, для отладки. Для этого есть seed():

seed_demo.py
import random

random.seed(42)
print(random.randint(1, 100))  # всегда одно и то же число при одном и том же seed
Нужна случайность?randomсимуляции, игры, обучениеsecretsтокены, пароли,безопасность
Выбор модуля зависит от того, поставлена ли безопасность на карту

БЕЗОПАСНОСТЬ: random — не для паролей и токенов

Не генерируйте пароли и токены модулем random
random оптимизирован для скорости и статистического качества, а не для непредсказуемости против злоумышленника — его результат в принципе можно предсказать, зная внутреннее состояние генератора. Для всего «чувствительного к безопасности» (пароли, токены сессий, ключи) используйте модуль secrets.
secrets_demo.py
import secrets

token = secrets.token_hex(16)
print(token)  # криптографически стойкий случайный токен
Практика: random vs secrets
Интерактивный ноутбук прямо в браузере — выберите правильный инструмент для задачи
Открыть практику →