Spec-Zone.ru › NumPy 1.18

Генератор псевдослучайных чисел Мерсенна-Твистер (MT19937)

class numpy.random.MT19937(seed=None)

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

Параметры
seed{None, int, array_like[ints], SeedSequence}, optional

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

Примечания

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

Модуль «random» стандартной библиотеки Python также содержит генератор псевдослучайных чисел Мерсенна-Твистер.

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

Вектор состояния 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)

Хироси Харамото, Макото Мацумото и Пьер Л’Экуйер, «Алгоритм быстрого перехода вперёд для линейных рекурренций в полиномиальном пространстве», Последовательности и их приложения — SETA, 290–298, 2008.

2

Хироси Харамото, Макото Мацумото, Такудзи Нисимура, Франсуа Паннетон, Пьер Л’Экуйер, «Эффективный переход вперёд для генераторов случайных чисел F2-линейных», ЖУРНАЛ INFORMS ПО ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКЕ, том 20, № 3, лето 2008 г., стр. 385-390.

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

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

Состояние

state

Получение или установка состояния PRNG

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

jumped([jumps])

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

Расширение

cffi

Интерфейс CFFI

ctypes

Интерфейс ctypes

© 2005–2020 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.18/reference/random/bit_generators/mt19937.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API