梅森旋转算法 (MT19937)#

class numpy.random.MT19937(seed=None)#

用于梅森旋转伪随机数生成器的容器.

参数:
seed{None, int, array_like[ints], SeedSequence}, 可选

用于初始化 BitGenerator 的种子.如果为 None,则将从操作系统中提取新的、不可预测的熵.如果传递的是 intarray_like[ints],则它将被传递给 SeedSequence 以派生初始的 BitGenerator 状态.也可以传递一个 SeedSequence 实例.

备注

MT19937 提供了一个包含函数指针的容器,这些函数指针生成双精度数、无符号 32 和 64 位整数 [1].这些不能直接在 Python 中使用,必须由 Generator 或类似支持低级访问的对象使用.

Python 标准库模块 “random” 也包含一个梅森旋转伪随机数生成器.

State and Seeding

MT19937 状态向量由一个包含 624 个 32 位无符号整数的数组加上一个介于 0 到 624 之间的整数值组成,该整数值索引当前在主数组中的位置.

输入种子由 SeedSequence 处理以填充整个状态.第一个元素被重置,使得只有其最高有效位被设置.

Parallel Features

在并行应用程序中使用 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()

Compatibility Guarantee

MT19937 保证一个固定的种子总是会产生相同的随机整数流.

参考文献

[1] (1,2)

Hiroshi Haramoto, Makoto Matsumoto, 和 Pierre L’Ecuyer, “一个在多项式空间中快速跳跃线性递归的算法”, 序列及其应用 - SETA, 290–298, 2008.

[2]

原茂敏, 松本眞, 西村拓二, フランソワ・パネトン, ピエール・ルクイエ, “F2-線形乱数生成器のための効率的なジャンプアヘッド”, オペレーションズ・リサーチ, 第20巻, 第3号, 2008年夏, pp. 385-390.

属性:
lock: threading.Lock

锁定共享实例,以便在多个生成器中使用相同的位生成器而不会破坏状态.从位生成器生成值的代码应持有位生成器的锁.

状态#

state

获取或设置 PRNG 状态

并行生成#

jumped([jumps])

返回一个新的位生成器,其状态已跳跃

扩展#

cffi

CFFI 接口

ctypes

ctypes 接口