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

Классы Random() и SystemRandom() модуля random в Python

Классы генераторов псевдослучайных чисел

В Этом разделе представлены классы предоставляемые модулем random в Python.

Содержание:


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.