梅森扭曲者 (MT19937) #
- 类 numpy.random。MT19937(种子=无)#
Mersenne Twister 伪随机数生成器的容器。
- 参数:
- 种子{None, int, array_like[ints], SeedSequence},可选
用于初始化 的种子
BitGenerator
。如果没有,那么将从操作系统中提取新的、不可预测的熵。如果传递了int
orarray_like[ints]
,则将传递它以SeedSequence
导出初始BitGenerator
状态。也可能会通过一个SeedSequence
实例。
笔记
MT19937
提供了一个胶囊,其中包含生成双精度数以及无符号 32 和 64 位整数的函数指针[1]。这些在 Python 中不能直接使用,必须由Generator
支持低级访问的对象或类似对象使用。Python stdlib 模块“random”还包含 Mersenne Twister 伪随机数生成器。
状态和种子
状态
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 JOURNAL ON COMPUTING,卷。 20,第 3 期,2008 年夏季,第 385-390 页。
- 属性:
- 锁:线程.Lock
锁定共享的实例,以便同一个 git 生成器可以在多个生成器中使用,而不会破坏状态。从位生成器生成值的代码应该持有位生成器的锁。
状态#
获取或设置 PRNG 状态 |
并行生成#
|
返回状态跳转的新位生成器 |
扩展#
CFFI接口 |
|
ctypes接口 |