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