基于 Philox 计数器的 RNG#
- class 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}, optional
Philox 状态中使用的计数器.可以是 [0, 2256) 中的 Python 整数(2.x 中为 long),也可以是 4 元素 uint64 数组.如果未提供,则 RNG 初始化为 0.
- key{None, int, array_like}, optional
Philox 状态中使用的密钥.与
seed不同,key 中的值是直接设置的.可以是 [0, 2128) 中的 Python 整数,也可以是 2 元素 uint64 数组. key 和seed不能同时使用.
注释
Philox 是一个 64 位 PRNG,它使用基于加密函数的较弱(且更快)版本的基于计数器的设计 [1] .使用不同密钥值的实例会生成独立的序列.Philox 的周期为 \(2^{256} - 1\) ,支持任意推进和以 \(2^{128}\) 的增量跳过序列.这些功能允许生成多个不重叠的序列.
Philox提供了一个包含函数指针的胶囊,这些指针生成双精度浮点数,以及无符号 32 位和 64 位整数.这些不能在 Python 中直接使用,必须由Generator或类似的,支持低级访问的对象使用.状态和播种
Philox状态向量由一个 256 位的值组成,编码为一个包含 4 个元素的 uint64 数组,以及一个 128 位的值,编码为一个包含 2 个元素的 uint64 数组.前者是一个计数器,每生成 4 个 64 位随机数,该计数器就会递增 1.后者是一个键,它决定了生成的序列.使用不同的键会生成独立的序列.输入
seed由SeedSequence处理以生成键.计数器设置为 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, 2256) 中的任何正步长推进计数器.当使用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 = 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
共享的锁实例,以便可以在多个生成器中使用相同的位生成器,而不会破坏状态. 从位生成器生成值的代码应持有该位生成器的锁.
状态#
获取或设置 PRNG 状态 |