Вихрь Мерсенна (MT19937)#

класс numpy.random.MT19937(seed=None)#

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

Параметры:
seed{None, int, array_like[ints], SeedSequence}, необязательный

Семя для инициализации BitGenerator. Если None, то свежая, непредсказуемая энтропия будет взята из ОС. Если int или array_like[ints] передается, то он будет передан в SeedSequence для получения начального BitGenerator состояние. Также можно передать SeedSequence экземпляр.

Примечания

MT19937 предоставляет капсулу, содержащую указатели на функции, которые производят числа с плавающей точкой двойной точности и беззнаковые 32- и 64-битные целые числа [1]. Они не потребляются напрямую в Python и должны быть потреблены Generator или аналогичный объект, поддерживающий низкоуровневый доступ.

Модуль Python stdlib "random" также содержит генератор псевдослучайных чисел Вихрь Мерсенна.

Состояние и инициализация

The MT19937 вектор состояния состоит из массива из 624 элементов 32-битных беззнаковых целых чисел плюс одно целое значение от 0 до 624, которое индексирует текущую позицию в основном массиве.

Входное начальное значение обрабатывается SeedSequence чтобы заполнить всё состояние. Первый элемент сбрасывается так, что установлен только его старший бит.

Параллельные возможности

Предпочтительный способ использования BitGenerator в параллельных приложениях - использовать SeedSequence.spawn метод для получения значений энтропии и их использования для генерации новых BitGenerators:

>>> from numpy.random import Generator, MT19937, SeedSequence
>>> sg = SeedSequence(1234)
>>> rg = [Generator(MT19937(s)) for s in sg.spawn(10)]

Другой метод заключается в использовании MT19937.jumped который продвигает состояние, как если бы \(2^{128}\) случайных чисел было сгенерировано ([1], [2]). Это позволяет разделить исходную последовательность так, чтобы различные сегменты могли использоваться в каждом рабочем процессе. Все генераторы должны быть соединены, чтобы гарантировать, что сегменты происходят из одной последовательности.

>>> from numpy.random import Generator, MT19937, SeedSequence
>>> sg = SeedSequence(1234)
>>> bit_generator = MT19937(sg)
>>> rg = []
>>> for _ in range(10):
...    rg.append(Generator(bit_generator))
...    # Chain the BitGenerators
...    bit_generator = bit_generator.jumped()

Гарантия совместимости

MT19937 гарантирует, что фиксированное начальное значение всегда будет давать одинаковый поток случайных целых чисел.

Ссылки

[1] (1,2)

Хироши Харамото, Макото Мацумото и Пьер Л’Экюйер, «Быстрый алгоритм прыжка вперёд для линейных рекуррентностей в полиномиальном пространстве», Sequences and Their Applications - SETA, 290–298, 2008.

[2]

Хироши Харамото, Макото Мацумото, Такуджи Нишимура, Франсуа Паннетон, Пьер Л'Экюйер, «Эффективный переход вперед для F2-линейных генераторов случайных чисел», INFORMS JOURNAL ON COMPUTING, Том 20, № 3, Лето 2008, стр. 385-390.

Атрибуты:
lock: threading.Lock

Экземпляр Lock, который является общим, чтобы один и тот же генератор битов мог использоваться в нескольких Generators без повреждения состояния. Код, который генерирует значения из генератора битов, должен удерживать блокировку генератора битов.

Состояние#

state

Получить или установить состояние ГПСЧ

Параллельная генерация#

jumped([jumps])

Возвращает новый генератор битов с перепрыгнутым состоянием

Расширение#

cffi

CFFI интерфейс

ctypes

интерфейс ctypes