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