Philox 基于计数器的 RNG #
- 类 numpy.random。Philox (种子= None , counter = None , key = None ) #
Philox (4x64) 伪随机数生成器的容器。
- 参数:
- 种子{None, int, array_like[ints], SeedSequence},可选
用于初始化 的种子
BitGenerator
。如果没有,那么将从操作系统中提取新的、不可预测的熵。如果传递了int
orarray_like[ints]
,则将传递它以SeedSequence
导出初始BitGenerator
状态。也可能会通过一个SeedSequence
实例。- 计数器{None, int, array_like},可选
在 Philox 状态下使用的计数器。可以是 [0, 2**256) 中的 Python int(在 2.x 中为 long)或 4 元素 uint64 数组。如果未提供,则 RNG 初始化为 0。
- key {None, int, array_like}, 可选
在 Philox 状态下使用的钥匙。与 不同的是
seed
,key 中的值是直接设置的。可以是 [0, 2**128) 中的 Python int 或 2 元素 uint64 数组。键,并且seed
不能同时使用。
笔记
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
参数并直接设置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
方法来推进状态,就像\(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
- 属性:
- 锁:线程.Lock
锁定共享的实例,以便同一个 git 生成器可以在多个生成器中使用,而不会破坏状态。从位生成器生成值的代码应该持有位生成器的锁。
状态#
获取或设置 PRNG 状态 |
并行生成#
|
推进基础 RNG,就好像 Delta 抽签已经发生一样。 |
|
返回状态跳转的新位生成器 |
扩展#
CFFI接口 |
|
ctypes接口 |