Сообщить об ошибке.

Инициализация и состояние генератора в Python

Начальное состояние генератора и его состояния

В разделе рассмотрены функции инициализации генератора, а так же получения и установки внутреннего состояния генератора случайных чисел модуля random.

Содержание:


random.seed(a=None, version=2):

Функция random.seed() инициализирует генератор или по другому - задает его начальное состояние.

Данный метод очень удобен для воспроизводимости результатов, т.е. после инициализации одним и тем же значением a, вы будете наблюдать одни и те же случайные данные. Например если важно, что бы кто-то мог воспроизвести мои результаты на своем компьютере, то нужно обязательно указать в примере кода начальное состояние:

>>> import random
>>> random.seed(9)
>>> [random.randint(0, 100) for i in range(10)]
# [59, 78, 47, 34, 17, 23, 86, 0, 43, 64]

Если инициализировать генератор с тем же самым значением, то увидим тот же самый результат его работы:

>>> import random
>>> random.seed(9)
>>> [random.randint(0, 100) for i in range(10)]
# [59, 78, 47, 34, 17, 23, 86, 0, 43, 64]

Если аргумент a не указан или равен None, то в качестве начального состояния a используется текущее системное время. Но в случае если используется системный генератор random.SystemRandom(), то начальное состояние определяется реализацией источника энтропии самой системы.

Параметр version может быть установлен только в два значения:

  • version=1 - все биты объектов str, bytes и bytearray используются для их преобразования в объект int;
  • version=2 - преобразует str и bytes в более узкий диапазон объектов int:
>>> import random
>>> random.seed('abc', version=2)
>>> random.random()
# 0.7720246314157545
>>> random.seed('abc', version=1)
>>> random.random()
# 0.09639374978773074

Устарело с версии Python 3.9: в будущем seed должно быть одного из следующих типов: NoneType, int, float, str, bytes или bytearray.

random.getstate():

Функция random.getstate() возвращает кортеж с параметрами внутреннего состояния генератора, который может быть использован для воссоздания этого состояния.

Возвращаемый кортеж очень большой:

>>> import random
>>> state = random.getstate()
>>> state    #  часть элементов вырезана для краткости
# (3, (1002711802, 682444530, 1789300164, 1742551194, 
# 3673533430, 2138841612, 171958272, 427317758, 
# ...
# ...
# 165950252, 2), None)

Этот кортеж может быть передан функции random.setstate() для восстановления исходного состояния генератора.

random.setstate(state):

Функция random.setstate() задает внутреннее состояние генератора на основе кортежа с его параметрами, который можно получить с помощью функции random.getstate().

Данная функция отличается от random.seed() тем что фиксирует состояние генератора "здесь и сейчас", т.е. состояние генератора в тот самый момент, когда оно было получено с помощью функции random.getstate().

>>> state = random.getstate()
>>> random.setstate(state)
>>> [random.randint(0, 50) for i in range(9)]
# [36, 1, 34, 45, 27, 41, 8, 31, 32]
>>> [random.randint(0, 50) for i in range(9)]
# [48, 0, 0, 11, 12, 38, 44, 33, 40]

# восстановим состояние и получим те же 
# случайные числа, даже если выйти и снова 
# зайти в интерпретатор
>>> random.setstate(state)
>>> [random.randint(0, 50) for i in range(9)]
# [36, 1, 34, 45, 27, 41, 8, 31, 32]

random.getrandbits(k):

Функция random.getrandbits() возвращает целое число состоящее из k случайных бит.

>>> import random
>>> random.getrandbits(4)
# 14
>>> random.getrandbits(8)
# 142
>>> random.getrandbits(16)
# 7291
>>> random.getrandbits(32)
# 2126312744

Благодаря данному методу random.randrange() может работать со сколь угодно большими диапазонами.

Изменено в Python 3.9: теперь этот метод принимает ноль для аргумента k.