Philox 基于计数器的 RNG#

class numpy.random.Philox(seed=None, counter=None, key=None)#

Philox (4x64) 伪随机数生成器的容器.

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

用于初始化 BitGenerator 的种子. 如果为 None,则将从操作系统中提取新鲜的,不可预测的熵. 如果传递一个 intarray_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 数组. keyseed 不能同时使用.

注释

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.后者是确定生成序列的键.使用不同的键会生成独立的序列.

输入的 seedSeedSequence 处理以生成键.计数器设置为 0.

或者,可以省略 seed 参数并直接设置 keycounter .

并行特性

在并行应用程序中使用 BitGenerator 的首选方法是使用 SeedSequence.spawn 方法来获取熵值,并使用这些熵值来生成新的 BitGenerator:

>>> from numpy.random import Generator, Philox, SeedSequence
>>> sg = SeedSequence(1234)
>>> rg = [Generator(Philox(s)) for s in sg.spawn(10)]

通过调用 jumped 方法以使状态前进, 就像已经生成了 \(2^{128}\) 个随机数一样,可以在并行应用程序中使用 Philox .或者,可以使用 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

锁定共享的实例,以便相同的位生成器可以在多个生成器中使用,而不会破坏状态.从位生成器生成值的代码应持有该位生成器的锁.

状态#

state 

获取或设置 PRNG 状态

并行生成#

advance (delta)

提前底层 RNG,就像发生了 delta 次抽取一样.

jumped ([jumps])

返回一个状态被跳跃的新位生成器.

扩展#

cffi 

CFFI 接口

ctypes 

ctypes 接口