std::philox_engine
来自 cppreference.com
定义在头文件 <random> 中 |
||
template< class UIntType, std::size_t w, std::size_t n, std::size_t r, |
(自 C++26 起) | |
std::philox_engine
是一个基于计数器的随机数引擎。
内容 |
[编辑] 模板参数
UIntType | - | 生成器生成的結果類型。如果此類型不是 unsigned short、unsigned int、unsigned long 或 unsigned long long 之一,則行為未定義。 |
w | - | 以位为单位的字大小 |
n | - | 字计数 |
r | - | 回合计数 |
consts | - | 用于生成随机数的乘数和回合常数序列 |
如果以下任何值不为 true,程序将形成错误
- 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,其中每个值都在
[
0,
2
w
)
中。
- 此序列表示一个大的无符号整数计数器值 Z=∑n-1
j=0X⋅2wj
,包含 n⋅w 位。
- 此序列表示一个大的无符号整数计数器值 Z=∑n-1
- 一个 n / 2 个类型为
UIntType
的键的序列 K。 - 一个包含 n 个类型为
UIntType
的生成值的缓冲区 Y。 - 在 Y 缓冲区中的索引 j。
philox_engine
的转换算法 (TA(X
i)) 定义如下
- 生成一个新的包含 n 个随机值的序列(见下文)并将其存储在 Y 中。
- 将计数器 Z 增加 1。
- 将 j 重置为 0。
philox_engine
的生成算法 为 GA(X
i)=Y
j.
[编辑] 生成随机值
随机值从以下参数生成
- 回合数 r
- 当前计数器序列 X
- 密钥序列 K
- 乘数序列 M
- 回合常数序列 C
序列 M 和 C 由模板参数包 consts 中的值形成,它表示 M
k 和 C
k 常数,如 [
M
0,
C
0,
M
1,
C
1,... , ...,
M
n/2-1,
C
n/2-1]
.
随机数通过以下过程生成
- 用 X 的元素初始化输出序列 S。
- 更新 S 的元素 r 回合。
- 用 S 中的值替换缓冲区 Y 中的值。
[编辑] 更新输出序列
对于每一轮更新,一个中间序列 V 用 S 的元素按特定顺序初始化
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 |
N/A | |||||||||||||
4 | S 0 |
S 3 |
S 2 |
S 1 |
N/A | |||||||||||
8 | S 2 |
S 1 |
S 4 |
S 7 |
S 6 |
S 5 |
S 0 |
S 3 |
N/A | |||||||
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 为当前回合数(从零开始),对于 [
0,
n / 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) |
推进引擎的状态并返回生成的数值 (公有成员函数) |
(C++26) |
按指定数量推进引擎的状态 (公有成员函数) |
特征 | |
[静态] (C++26) |
获取输出范围内的最小可能值 (公有静态成员函数) |
[静态] (C++26) |
获取输出范围内的最大可能值 (公有静态成员函数) |
[编辑] 非成员函数
(C++26) |
比较两个伪随机数引擎的内部状态 (函数) |
(C++26) |
对伪随机数引擎执行流输入和输出 (函数模板) |
[编辑] 注释
功能测试 宏 | 值 | Std | 功能 |
---|---|---|---|
__cpp_lib_philox_engine |
202406L | (C++26) | std::philox_engine
|
[编辑] 示例
本节内容尚未完善 原因:没有示例 |