Генератор псевдослучайных чисел Mersenne Twister (MT19937)
-
class numpy.random.MT19937(seed=None) -
Контейнер для генератора псевдослучайных чисел Mersenne Twister.
- Параметры
-
-
seed{None, int, array_like[ints], SeedSequence}, optional -
Seed для инициализации
BitGenerator. Если None, то свежая, непредсказуемая энтропия будет извлечена из ОС. Если передается объект типаintилиarray_like[ints], то он будет передан вSeedSequenceдля получения начального состоянияBitGenerator. Можно также передать экземплярSeedSequence.
-
Примечания
MT19937предоставляет капсулу, содержащую указатели на функции, которые генерируют числа с плавающей точкой двойной точности, а также беззнаковые 32- и 64-битные целые числа [1]. Они не могут быть напрямую использованы в Python и должны обрабатываться объектом типаGeneratorили подобным, который поддерживает низкоуровневый доступ.Модуль Python stdlib «random» также содержит генератор псевдослучайных чисел Mersenne Twister.
Состояние и инициализация
Вектор состояния
MT19937состоит из 624-элементного массива 32-битных беззнаковых целых чисел плюс одно целое число от 0 до 624, которое индексирует текущую позицию в основном массиве.Входной seed обрабатывается функцией
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, который продвигается вперед по состоянию, как будтослучайных чисел были сгенерированы ([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гарантирует, что при фиксированном seed всегда будет генерироваться один и тот же поток случайных целых чисел.Ссылки
-
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
-
Экземпляр блокировки, который используется совместно, чтобы один и тот же генератор битов мог использоваться в нескольких генераторах без повреждения состояния. Код, который генерирует значения из генератора битов, должен удерживать блокировку генератора битов.
Состояние
Получить или установить состояние генератора псевдослучайных чисел |
Параллельная генерация
| Возвращает новый генератор битов с измененным состоянием |
Расширение
CFFI интерфейс | |
ctypes интерфейс |
© 2005–2020 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.19/reference/random/bit_generators/mt19937.html