梅森旋转算法 (MT19937)#
- class numpy.random.MT19937(seed=None)#
梅森旋转算法伪随机数生成器的容器。
- 参数:
- seed{None, int, array_like[ints], SeedSequence},可选
用于初始化
BitGenerator
的种子。如果为 None,则将从操作系统中获取全新的、不可预测的熵。如果传入int
或array_like[ints]
,则会将其传递给SeedSequence
以推导初始的BitGenerator
状态。也可以传入一个SeedSequence
实例。
备注
MT19937
提供了一个包含函数指针的胶囊,这些函数指针可以生成双精度浮点数、无符号 32 位和 64 位整数 [1]。这些在 Python 中不能直接使用,必须由支持低级访问的Generator
或类似对象来使用。Python 标准库模块 “random” 也包含一个梅森旋转算法伪随机数生成器。
状态和播种
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 和 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
锁实例,共享以确保相同的位生成器可在多个 Generator 中使用而不会破坏状态。从位生成器生成值的代码应持有该位生成器的锁。
状态#
获取或设置 PRNG 状态 |
并行生成#
|
返回一个状态已跳跃的新位生成器 |