seed и воспроизводимость
Псевдослучайность можно «заморозить» — и это не баг, а важнейшая возможность для отладки и тестирования.
seed() — задаём начальное состояние генератора
Раз псевдослучайный генератор — это формула с состоянием, то, задав одно и то же начальное состояние («зерно», seed), можно заставить его выдать ровно ту же последовательность чисел снова:
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, которые мы использовали, работают с
одним общим, «глобальным» генератором. Если нужен отдельный, независимый генератор —
например, чтобы одна часть программы не влияла на случайность другой — можно создать
собственный экземпляр:
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, спроектированный именно для
безопасности, а не для скорости.
randomsecretsimport secrets
token = secrets.token_hex(16) # криптографически надёжный случайный токен
print(token)
random — для игр, симуляций и учебных задач; secrets — там, где случайность защищает что-то ценное. Подробнее о безопасности мы поговорим в более поздних главах.