numpy.random.
Philox
Philox(4x64)伪随机数生成器的容器。
初始化的种子 BitGenerator . 如果没有,那么新的,不可预测的熵将从操作系统中提取。如果 int 或 array_like[ints] 如果通过了,那么它将被传递给 SeedSequence 导出初始值 BitGenerator 州。你也可以通过 SeedSequence 实例。
BitGenerator
int
array_like[ints]
SeedSequence
在Philox州使用的计数器。可以是[0,2**256]中的Python int(2.x中的long)或4元素uint64数组。如果未提供,RNG将在0处初始化。
在Philox州使用的密钥。不像 seed ,则直接设置键中的值。可以是[0,2**128)中的Python int或2元素uint64数组。 key 和 seed 不能同时使用。
seed
笔记
Philox是一种64位PRNG,它使用基于计数器的设计,这种设计基于较弱(和更快)版本的加密函数 [1]. 使用不同键值的实例生成独立的序列。Philox有一段 并支持以 . 这些特性允许生成多个不重叠的序列。
Philox 提供包含生成双精度、无符号32位和64位整数的函数指针的胶囊。它们在Python中不能直接使用,必须由 Generator 或支持低级访问的类似对象。
Generator
状态和种子
这个 Philox 状态向量由编码为4元素uint64数组的256位值和编码为2元素uint64数组的128位值组成。前者是一个计数器,每产生4个64位随机数,计数器就递增1。第二个是决定产生序列的键。使用不同的键产生独立的序列。
输入 seed 处理者 SeedSequence 生成密钥。计数器设置为0。
或者,可以省略 seed 参数并设置 key 和 counter 直接。
key
counter
平行特征
在并行应用程序中使用位生成器的首选方法是使用 SeedSequence.spawn 方法获取熵值,并使用这些值生成新的位生成器:
SeedSequence.spawn
>>> from numpy.random import Generator, Philox, SeedSequence >>> sg = SeedSequence(1234) >>> rg = [Generator(Philox(s)) for s in sg.spawn(10)]
Philox 可以通过调用 jumped 方法使状态前进 已生成随机数。或者, advance 可用于推进[0,2**256]中任何正阶跃的计数器。使用时 jumped ,所有生成器应链接起来,以确保片段来自同一序列。
jumped
advance
>>> 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 将始终生成相同的随机整数流。
工具书类
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接口