NumPy参考 >例行程序 >Random sampling (numpy.random) >Bit Generators > Philox
numpy.random.
Philox
(seed = None,counter = None,key = None )¶Philox(4x64)伪随机数生成器的容器。
初始化的种子BitGenerator
。如果为None,则将从操作系统中提取新鲜的,不可预测的熵。如果传递了int
或
array_like[ints]
,则将传递
SeedSequence
以获得初始BitGenerator
状态。一个SeedSequence
实例也可能通过。
在Philox状态下使用的计数器。可以是[0,2 ** 256]中的Python int(长于2.x)或4元素的uint64数组。如果未提供,则将RNG初始化为0。
在Philox状态下使用的密钥。与不同seed
,键中的值是直接设置的。可以是[0,2 ** 128)中的Python int或2元素的uint64数组。键,seed
不能同时使用。
笔记
Philox是一种64位PRNG,它使用基于计数器的设计,该设计基于较弱(且较快)的加密功能版本[1]。使用密钥的不同值的实例将产生独立的序列。Philox的周期为,并支持任意前进和以的增量跳跃序列。这些功能允许生成多个不重叠的序列。
Philox
提供一个包含函数指针的封装,该函数指针生成双精度数以及无符号的32位和64位整数。这些在Python中不可直接使用,必须由Generator
支持低级访问的一个或类似对象使用。
状态与播种
该Philox
状态向量包括编码为4元件阵列UINT64一个256位的值的和一个128位的值编码为2元件UINT64阵列。前者是一个计数器,每产生4个64位随机数,计数器就会增加1。第二个是确定生成顺序的键。使用不同的键会产生独立的序列。
输入seed
被处理SeedSequence
以生成密钥。计数器设置为0。
或者,可以省略seed
参数key
并counter
直接设置和
。
平行功能
在并行应用程序中使用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
方法是调用该方法以提高状态(如果已生成随机数)。或者,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
将始终产生相同的随机整数流。
参考文献
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 generator可以在多个Generator中使用,而不会破坏状态。从位生成器生成值的代码应持有位生成器的锁。