std::philox_engine

来自cppreference.com
< cpp‎ | numeric‎ | random
 
 
 
 
 
在标头 <random> 定义
template<

    class UIntType, std::size_t w, std::size_t n, std::size_t r,
    UIntType... consts
>

class philox_engine;
(C++26 起)

std::philox_engine 是一个基于计数器的随机数生成引擎。

模板形参

UIntType - 生成器所生成的结果类型。如果它不是 unsigned shortunsigned intunsigned longunsigned long long 之一,那么效果未定义。
w - 状态序列按位计的字大小
n - 状态序列字数
r - 状态更新轮数
consts - 生成随机数时用到的乘数和轮次常量序列

如果以下值中有 false,那么程序非良构:

  • sizeof...(consts) == n
  • n == 2 || n == 4 || n == 8 || n == 16
  • 0 < r
  • 0 < w && w <= std::numeric_limits<UIntType>::digits

生成器属性

在以下描述中,以 Q
i
表示序列 Q 的第 i 个元素,其中下标从零开始。

philox_engine 的状态的大小O(n),它包含以下四个部分:

  • 包含 n 个整数值的序列 X,其中每个值都在 [02w
    ) 中。
  • 此序列用来表示一个 n⋅w 位的无符号整数计数器 Z=∑n-1
    j=0
    X⋅2wj
  • 包含 n / 2UIntType 类型键的序列 K
  • 包含 nUIntType 类型生成值的缓冲区 Y
  • 缓冲区 Y 中的索引 j

philox_engine变换算法TA(x
i
)
)定义如下:

  • 如果 j 不是 n - 1,那么使 j 增加 1[1]
  • 如果 jn - 1,那么进行一下操作[2]
  1. 生成包含 n 个随机值的新序列(见下文),并将这些值存储在 Y 中。
  2. 使计数器 Z 增加 1
  3. 重置 j0

philox_engine生成算法GA(X
i
)=Y
j

  1. 这种情况下在下次调用生成算法时会返回缓冲区中的下一个生成值。
  2. 这种情况下会刷新缓冲区,并且在下次调用生成算法时会返回新缓冲区中的第一个值。

生成随机值

随机数通过以下参数生成:

  • 状态更新轮数 r
  • 当前计数器序列 X
  • 键序列 K
  • 乘数序列 M
  • 轮次常量序列 C

序列 MC 以形参包 consts 中的值组成,各 M
k
C
k
常量以 [M
0
, C
0
, M
1
, C
1
,... , ..., M
n/2-1
, C
n/2-1
] 的形式表示。

随机数按以下流程生成:

  1. X 中的元素初始化输出序列 S
  2. S 中的元素更新 r 轮。
  3. S 中的值替换缓冲区 Y 中的值。

更新输出序列

在每轮更新中,都会以 S 中的元素按以下顺序初始化中间序列 V 中的元素:

 n      V
0
    
    V
1
    
    V
2
    
    V
3
    
    V
4
    
    V
5
    
    V
6
    
    V
7
    
    V
8
    
    V
9
    
 V
10
 
 V
11
 
 V
12
 
 V
13
 
 V
14
 
 V
15
 
2 S
0
S
1
不适用
4 S
0
S
3
S
2
S
1
不适用
8 S
2
S
1
S
4
S
7
S
6
S
5
S
0
S
3
不适用
16 S
0
S
9
S
2
S
13
S
6
S
11
S
4
S
15
S
10
S
7
S
12
S
3
S
14
S
5
S
8
S
1

给定以下操作表示:

  • xor,内建的逐位异或
  • mullo,它计算模乘法结果的低半区的值,定义为 mullo(a,b,w)=(a⋅b) mod 2w
  • mulhi,它计算乘法结果的高半区的值,定义为 mulhi(a,b,w)=⌊(a⋅b)/2w
    .

q 为当前轮数(从零开始),对 [0n / 2) 中的每个整数 k,通过以下方法更新 S 中的元素:

  • X
    2⋅k
    =mullo(V
    2⋅k+1
    ,M
    k
    ,w)
  • X
    2⋅k+1
    =mulhi(V
    2⋅k+1
    ,M
    k
    ,w) xor ((K
    k
    +q⋅C
    k
    ) mod 2w
    ) xor V
    2⋅k

预定义特化

下列特化定义了两种常用参数集的随机数引擎:

在标头 <random> 定义
类型 定义
philox4x32 (C++26) std::philox_engine<std::uint_fast32_t, 32, 4, 10,
                   0xD2511F53, 0x9E3779B9,
                   0xCD9E8D57, 0xBB67AE85>
philox4x64 (C++26) std::philox_engine<std::uint_fast64_t, 64, 4, 10,
                   0xD2E7470EE14C6C93, 0x9E3779B97F4A7C15,
                   0xCA5A826395121157, 0xBB67AE8584CAA73B>

嵌套类型

类型 定义
result_type UIntType

数据成员

constexpr std::size_t word_size
[静态]
w
(公开静态成员常量)
constexpr std::size_t word_count
[静态]
n
(公开静态成员常量)
constexpr std::size_t round_count
[静态]
r
(公开静态成员常量)
constexpr std::array<result_type, word_count / 2> multipliers
[静态]
乘数序列 M
(公开静态成员常量)
constexpr std::array<result_type, word_count / 2> round_consts
[静态]
轮次常量序列 C
(公开静态成员常量)
constexpr std::uint_least32_t default_seed
[静态]
20111115u
(公开静态成员常量)

成员函数

构造与播种
构造引擎
(公开成员函数)
(C++26)
设置引擎的当前状态
(公开成员函数)
设置引擎的当前计数器
(公开成员函数)
生成
推进引擎状态并返回生成的值
(公开成员函数)
(C++26)
令引擎状态前进指定量
(公开成员函数)
特征
[静态] (C++26)
获取输出范围中的最小可能值
(公开静态成员函数)
[静态] (C++26)
获取输出范围中的最大可能值
(公开静态成员函数)

非成员函数

比较两个伪随机数引擎的内部状态
(函数)
执行伪随机数引擎的流输入和输出
(函数模板)

注解

功能特性测试 标准 功能特性
__cpp_lib_philox_engine 202406L (C++26) std::philox_engine

示例