Philox 基于计数器的随机数生成器#

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

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

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

用于初始化 BitGenerator 的种子.如果为 None,则将从操作系统中提取新的、不可预测的熵.如果传递的是 intarray_like[ints],则它将被传递给 SeedSequence 以派生初始的 BitGenerator 状态.也可以传递一个 SeedSequence 实例.

counter{None, int, array_like}, 可选

在 Philox 状态中使用的计数器.可以是 Python int(2.x 中的 long)在 [0, 2**256) 范围内,或者是 4 元素的 uint64 数组.如果未提供,则 RNG 初始化为 0.

key{None, int, array_like}, 可选

在 Philox 状态中使用的键.与 seed 不同,键中的值是直接设置的.可以是 [0, 2**128) 范围内的 Python int 或 2 元素的 uint64 数组.`key` 和 seed 不能同时使用.

备注

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

Philox 提供了一个包含函数指针的胶囊,这些函数指针产生双精度数、无符号 32 位和 64 位整数.这些不能直接在 Python 中使用,必须由 Generator 或类似支持低级访问的对象使用.

State and Seeding

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

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

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

Parallel Features

在并行应用程序中使用 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 = 2**96 + 2**33 + 2**17 + 2**9
>>> rg = [Generator(Philox(key=key+i)) for i in range(10)]

Compatibility Guarantee

Philox 保证一个固定的 seed 将始终产生相同的随机整数流.

参考文献

[1]

John K. Salmon, Mark A. Moraes, Ron O. Dror, 和 David E. Shaw, “并行随机数:就像1, 2, 3一样简单,” 高性能计算、网络、存储和分析国际会议论文集 (SC11), 纽约, 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)

推进底层随机数生成器,就像已经进行了 delta 次抽取一样.

jumped([jumps])

返回一个新的位生成器,其状态已跳跃

扩展#

cffi

CFFI 接口

ctypes

ctypes 接口