梅森旋转算法 (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”也包含梅森旋转伪随机数生成器。

状态和播种

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 和 Pierre L’Ecuyer,“多项式空间中线性递推的快速跳跃算法”,序列及其应用 - SETA,290-298,2008 年。

[2]

Hiroshi Haramoto、Makoto Matsumoto、Takuji Nishimura、François Panneton、Pierre L’Ecuyer,“F2-线性随机数生成器的有效跳跃”,INFORMS 计算机杂志,第 20 卷,第 3 期,2008 年夏季,第 385-390 页。

属性:
lock: threading.Lock

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

状态#

state

获取或设置 PRNG 状态

并行生成#

jumped([jumps])

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

扩展#

cffi

CFFI 接口

ctypes

ctypes 接口