Глава 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 — не для паролей и токенов
Не генерируйте пароли и токены модулем random
random оптимизирован для скорости и статистического качества, а не для непредсказуемости против злоумышленника — его результат в принципе можно предсказать, зная внутреннее состояние генератора. Для всего «чувствительного к безопасности» (пароли, токены сессий, ключи) используйте модуль secrets.secrets_demo.py
import secrets
token = secrets.token_hex(16)
print(token) # криптографически стойкий случайный токен
Практика: random vs secrets
Интерактивный ноутбук прямо в браузере — выберите правильный инструмент для задачи