Philox 基于计数器的RNG#
- 类 numpy.random.Philox(seed=None, counter=None, key=None)#
Philox (4x64) 伪随机数生成器的容器。
- 参数:
- seed{None, int, array_like[ints], SeedSequence}, 可选
用于初始化
BitGenerator
的种子。如果为 None,则将从操作系统中获取全新的、不可预测的熵。如果传入一个int
或array_like[ints]
,则会将其传递给SeedSequence
以推导出初始的BitGenerator
状态。也可以传入一个SeedSequence
实例。- counter{None, int, array_like}, 可选
Philox 状态中使用的计数器。可以是 [0, 2**256) 范围内的 Python int(2.x 中为 long),也可以是 4 元素 uint64 数组。如果未提供,则 RNG 初始化为 0。
- key{None, int, array_like}, 可选
Philox 状态中使用的键。与
seed
不同,key 的值直接设置。可以是 [0, 2**128) 范围内的 Python int,也可以是 2 元素 uint64 数组。key 和seed
不能同时使用。
备注
Philox 是一种 64 位 PRNG,它采用基于较弱(且更快)的密码学函数版本 [1] 的计数器设计。使用不同 key 值的实例会产生独立的序列。Philox 的周期为 \(2^{256} - 1\),支持以 \(2^{128}\) 为增量进行任意前进和跳跃序列。这些特性允许生成多个不重叠的序列。
Philox
提供一个包含函数指针的胶囊(capsule),这些函数指针生成双精度浮点数、无符号 32 位和 64 位整数。这些不能直接在 Python 中使用,必须由支持低级访问的Generator
或类似对象使用。状态和播种
Philox
状态向量由一个编码为 4 元素 uint64 数组的 256 位值和一个编码为 2 元素 uint64 数组的 128 位值组成。前者是一个计数器,每生成 4 个 64 位随机数就递增 1。后者是一个确定所生成序列的键。使用不同的键会生成独立的序列。输入
seed
由SeedSequence
处理以生成 key。计数器设置为 0。或者,可以省略
seed
参数并直接设置key
和counter
。并行特性
在并行应用中使用 BitGenerator 的首选方式是使用
SeedSequence.spawn
方法获取熵值,并使用这些值生成新的 BitGenerator>>> from numpy.random import Generator, Philox, SeedSequence >>> sg = SeedSequence(1234) >>> rg = [Generator(Philox(s)) for s in sg.spawn(10)]
Philox
可在并行应用中使用,通过调用jumped
方法来推进状态,就像已经生成了 \(2^{128}\) 个随机数一样。或者,可以使用advance
在 [0, 2**256) 范围内以任意正步长推进计数器。当使用jumped
时,所有生成器都应链接起来,以确保段来自同一序列。>>> from numpy.random import Generator, Philox >>> bit_generator = Philox(1234) >>> rg = [] >>> for _ in range(10): ... rg.append(Generator(bit_generator)) ... bit_generator = bit_generator.jumped()
另外,
Philox
也可以在并行应用中使用,方法是使用一系列不同的 key,其中每个实例使用不同的 key。>>> key = 2**96 + 2**33 + 2**17 + 2**9 >>> rg = [Generator(Philox(key=key+i)) for i in range(10)]
兼容性保证
Philox
保证固定的seed
将始终产生相同的随机整数流。参考文献
[1]John K. Salmon, Mark A. Moraes, Ron O. Dror, and David E. Shaw, “Parallel Random Numbers: As Easy as 1, 2, 3,” Proceedings of the International Conference for High Performance Computing, Networking, Storage and Analysis (SC11), New York, NY: ACM, 2011.
示例
>>> from numpy.random import Generator, Philox >>> rg = Generator(Philox(1234)) >>> rg.standard_normal() 0.123 # random
- 属性:
- lock: threading.Lock
共享的锁实例,以便同一比特生成器可在多个 Generator 中使用而不会损坏状态。从比特生成器生成值的代码应持有比特生成器的锁。
状态#
获取或设置 PRNG 状态 |