基于Philox计数器的RNG

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

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

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

初始化的种子 BitGenerator . 如果没有,那么新的,不可预测的熵将从操作系统中提取。如果 intarray_like[ints] 如果通过了,那么它将被传递给 SeedSequence 导出初始值 BitGenerator 州。你也可以通过 SeedSequence 实例。

counter无,int,数组,可选

在Philox州使用的计数器。可以是[0,2**256]中的Python int(2.x中的long)或4元素uint64数组。如果未提供,RNG将在0处初始化。

key无,int,数组,可选

在Philox州使用的密钥。不像 seed ,则直接设置键中的值。可以是[0,2**128)中的Python int或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。第二个是决定产生序列的键。使用不同的键产生独立的序列。

输入 seed 处理者 SeedSequence 生成密钥。计数器设置为0。

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

平行特征

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

>>> 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和David E.Shaw,“并行随机数:简单到1、2、3”,《高性能计算、网络、存储和分析国际会议论文集》(SC11),纽约:ACM,2011年。

实例

>>> from numpy.random import Generator, Philox
>>> rg = Generator(Philox(1234))
>>> rg.standard_normal()
0.123  # random
属性
锁定:螺纹。锁紧

锁定共享的实例,以便同一位git生成器可以在多个生成器中使用,而不会损坏状态。从位生成器生成值的代码应该保持位生成器的锁。

state 

获取或设置PRNG状态

并联发电

advance \(增量)

推进基础RNG,如同已发生增量绘制。

jumped \ [jumps] )

返回状态为跳转的新位生成器

延伸

cffi 

CFFI接口

ctypes 

ctypes接口