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 状态的计数器。可以是 Python int(2.x 中的 long)[0, 2**256) 或 4 元素 uint64 数组。如果未提供,则 RNG 初始化为 0。

key{None, int, array_like}, optional

用于 Philox 状态的密钥。与 seed 不同,key 中的值直接设置。可以是 Python int [0, 2**128) 或 2 元素 uint64 数组。keyseed 不能同时使用。

备注

Philox 是一个 64 位 PRNG,它使用基于较弱(且更快)的密码函数版本的基于计数器的设计 [1]。使用不同密钥值的实例会产生独立序列。Philox 的周期为 \(2^{256} - 1\),并支持以 \(2^{128}\) 为增量任意前进和跳过序列。这些功能允许多个不重叠的序列生成。

Philox 提供了一个包含函数指针的胶囊,这些指针会生成双精度浮点数以及无符号 32 位和 64 位整数。这些无法直接在 Python 中使用,必须由 Generator 或支持低级访问的类似对象来使用。

状态和种子

Philox 状态向量由一个编码为 4 元素 uint64 数组的 256 位值和一个编码为 2 元素 uint64 数组的 128 位值组成。前者是一个计数器,每生成 4 个 64 位随机数就会加 1。后者是决定序列生成的密钥。使用不同的密钥会产生独立的序列。

输入 seedSeedSequence 处理以生成密钥。计数器设置为 0。

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

并行特性

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

>>> 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 = 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])

返回一个状态已跳过的新的 bit generator

扩展#

cffi

CFFI 接口

ctypes

ctypes 接口