Вихрь Мерсенна (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 без повреждения состояния. Код, который генерирует значения из генератора битов, должен удерживать блокировку генератора битов.
Состояние#
Получить или установить состояние ГПСЧ |
Параллельная генерация#
|
Возвращает новый генератор битов с перепрыгнутым состоянием |