Mersenne Twister (MT19937)#

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

Mersenne Twister 伪随机数生成器的容器。

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

用于初始化 BitGenerator 的种子。如果为 None,则将从操作系统获取新的、不可预测的熵。如果传入一个 intarray_like[ints],它将被传递给 SeedSequence 以推导出初始 BitGenerator 状态。也可以传入一个 SeedSequence 实例。

备注

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

Python 标准库中的“random”模块也包含一个 Mersenne Twister 伪随机数生成器。

状态和种子

MT19937 的状态向量由一个 624 个元素的 32 位无符号整数数组和一个介于 0 和 624 之间的整数值组成,该整数值索引主数组中的当前位置。

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

并行特性

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

兼容性保证

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

共享的 Lock 实例,这样同一个 bit git 生成器可以在多个 Generator 中使用而不损坏状态。生成来自 bit generator 的值的代码应该持有 bit generator 的锁。

状态#

state

获取或设置 PRNG 状态

并行生成#

jumped([jumps])

返回一个状态已跳过的新的 bit generator

扩展#

cffi

CFFI 接口

ctypes

ctypes 接口