В разделе рассмотрены функции инициализации генератора, а так же получения и установки внутреннего состояния генератора случайных чисел модуля random
.
random.seed()
,random.getstate()
,random.setstate()
,random.getrandbits()
.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
.