В Этом разделе представлены классы предоставляемые модулем random
в Python.
random.Random()
,random.SystemRandom()
.random.Random([seed])
:Класс random.Random()
позволяет создать экземпляр генератора псевдослучайных чисел.
>>> import random >>> random.random() # 0.30048398549260846 >>> rng = random.Random() >>> rng.random() # 0.5006251624024478
Экземпляров генератора псевдослучайных чисел может быть несколько:
>>> rng_1 = random.Random() >>> rnd1 = random.Random() >>> rnd2 = random.Random() >>> rnd1.randint(0, 10) # 10 >>> rnd2.random() # 0.3866027202885963
Все экземпляры псевдослучайных чисел могут иметь разное внутреннее состояние, что очень удобно для воспроизводимости результатов:
>>> rnd1.seed(0) >>> rnd1.randint(0, 50) # 24 >>> rnd2.seed(2) >>> rnd2.randint(0, 100) # 7 >>> rnd1.seed(0) >>> rnd1.randint(0, 50) # 24 >>> >>> rnd2.seed(2) >>> rnd2.randint(0, 100) # 7
Устарело начиная с Python 3.9: в будущем начальное значение seed
должно быть одного из следующих типов: NoneType
, int
, float
, str
, bytes
или bytearray
.
random.SystemRandom([seed])
:Класс random.SystemRandom()
позволяет создать экземпляр генератора, использующим в качестве источника случайности (энтропии) ресурсы операционной системы. Данный класc основан на функции os.urandom(n)
, которая возвращает n
случайных байтов.
Экземпляр класса, в качестве методов, поддерживает большинство функций, реализованных в модуле random
.
>>> rng = random.SystemRandom() >>> rng.random() # 0.10022483422140394
Что бы посмотреть все методы, которые определяет класс random.SystemRandom()
используйте встроенную функцию dir()
.
Функция os.urandom()
доступна не на всех операционных системах, но в зависимости от реализации источника энтропии в используемой системе, полученные данные могут быть использованы для криптографических целей с определенными ограничениями. В то же время, использование данной функции может быть не совсем удобно в плане того, что она нечувствительна к начальному состоянию random.seed()
:
>>> import random >>> rng = random.SystemRandom(0) >>> rng.randint(0, 5000) # 3442 >>> rng = random.SystemRandom(0) >>> rng.randint(0, 5000) # 4250 >>> rng.randint(0, 5000) # 3461 >>> rng.seed(0) >>> rng.randint(0, 5000) # 3859 >>> rng.randint(0, 5000) # 2021
А попытка узнать внутреннее состояние генератора или установить его - приведет к ошибке:
>>> rng.setstate() # Traceback (most recent call last): # File "<stdin>", line 1, in <module> # File "/usr/lib/python3.6/random.py", line 696, in _notimplemented # raise NotImplementedError('System entropy source does not have state.') # NotImplementedError: System entropy source does not have state.