Генератор псевдослучайных чисел Мерсенна-Твистер (MT19937)
- classnumpy.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или подобным объектом, который поддерживает низкоуровневый доступ.В модуле Python stdlib «random» также есть генератор псевдослучайных чисел Мерсенна-Твистер.
Состояние и Зерно
Состояние
MT19937состоит из массива из 624 элементов 32-разрядных целых чисел без знака плюс одно целое число от 0 до 624, которое индексирует текущую позицию в главном массиве.Входное зерно обрабатывается
SeedSequenceдля заполнения всего состояния. Первый элемент сброшен таким образом, что установлен только его старший бит.Параллельные функции
Предпочтительный способ использования BitGenerator в параллельных приложениях — использование метода
SeedSequence.spawnдля получения значений энтропии и использование этих значений для генерации новых BitGenerator:>>> 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)Hiroshi Haramoto, Makoto Matsumoto, and Pierre L’Ecuyer, “A Fast Jump Ahead Algorithm for Linear Recurrences in a Polynomial Space”, Sequences and Their Applications - SETA, 290–298, 2008.
[2]Hiroshi Haramoto, Makoto Matsumoto, Takuji Nishimura, François Panneton, Pierre L’Ecuyer, “Efficient Jump Ahead for F2-Linear Random Number Generators”, INFORMS JOURNAL ON COMPUTING, Vol. 20, No. 3, Summer 2008, pp. 385-390.
- Атрибуты:
-
- lock: threading.Lock
-
Экземпляр блокировки, который совместно используется, чтобы один и тот же генератор битов мог использоваться в нескольких генераторах без повреждения состояния. Код, который генерирует значения из генератора битов, должен удерживать блокировку генератора битов.
Состояние
Получить или установить состояние PRNG |
Параллельная генерация
| Возвращает новый генератор битов со скользящим состоянием |
Расширение
© 2005–2024 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/2.0/reference/random/bit_generators/mt19937.html