std::philox_engine
来自cppreference.com
<tbody>
</tbody>
| 在标头 <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 short、unsigned int、unsigned long 或 unsigned long long 之一,那么效果未定义。
|
| w | - | 状态序列按位计的字大小 |
| n | - | 状态序列字数 |
| r | - | 状态更新轮数 |
| consts | - | 生成随机数时用到的乘数和轮次常量序列 |
如果以下值中有 false,那么程序非良构:
sizeof...(consts) == nn == 2 || n == 40 < r0 < w && w <= std::numeric_limits<UIntType>::digits
生成器属性
在以下描述中,以 Qi 表示序列 Q 的第 i 个元素,其中下标从零开始。
philox_engine 的状态的大小是 O(n),它包含以下四个部分:
- 包含
n个整数值的序列X,其中每个值都在[0,2w)中。
- 此序列用来表示一个 n⋅w 位的无符号整数计数器 Z=∑n-1
j=0X⋅2wj
。
- 此序列用来表示一个 n⋅w 位的无符号整数计数器 Z=∑n-1
- 包含
n / 2个UIntType类型键的序列K。 - 包含
n个UIntType类型生成值的缓冲区Y。 - 缓冲区
Y中的索引j。
philox_engine 的变换算法(TA(xi))定义如下:
- 生成包含
n个随机值的新序列(见下文),并将这些值存储在Y中。 - 使计数器
Z增加1。 - 重置
j为0。
philox_engine 的生成算法是 GA(Xi)=Yj。
生成随机值
随机数通过以下参数生成:
- 状态更新轮数
r - 当前计数器序列
X - 键序列
K - 乘数序列
M - 轮次常量序列
C
序列 M 和 C 以形参包 consts 中的值组成,各 Mk 和 Ck 常量以 [M0, C0, M1, C1,... , ..., Mn/2-1, Cn/2-1] 的形式表示。
随机数按以下流程生成:
- 以
X中的元素初始化输出序列S。 - 将
S中的元素更新r轮。 - 以
S中的值替换缓冲区Y中的值。
更新输出序列
在每轮更新中,都会以 S 中的元素按以下顺序初始化中间序列 V 中的元素:
n
|
V0 | V1 | V2 | V3 |
|---|---|---|---|---|
2
|
S0 | S1 | 不适用 | |
4
|
S2 | S1 | S0 | S3 |
给定以下操作表示:
- xor,内建的逐位异或。
- mullo,它计算模乘法结果的低半区的值,定义为 mullo(a,b,w)=(a⋅b) mod 2w
。 - mulhi,它计算乘法结果的高半区的值,定义为 mulhi(a,b,w)=⌊(a⋅b)/2w
⌋.
设 q 为当前轮数(从零开始),对 [0, n / 2) 中的每个整数 k,通过以下方法更新 S 中的元素:
- X2⋅k=mulhi(V2⋅k,Mk,w) xor ((Kk+q⋅Ck) mod 2w
) xor V2⋅k+1 - X2⋅k+1=mullo(V2⋅k,Mk,w)
预定义特化
下列特化定义了两种常用参数集的随机数引擎:
在标头
<random> 定义 | |
| 类型 | 定义 |
philox4x32 (C++26)
|
std::philox_engine<std::uint_fast32_t, 32, 4, 10, 0xCD9E8D57, 0x9E3779B9, 0xD2511F53, 0xBB67AE85>
|
philox4x64 (C++26)
|
std::philox_engine<std::uint_fast64_t, 64, 4, 10, 0xCA5A826395121157, 0x9E3779B97F4A7C15, 0xD2E7470EE14C6C93, 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 multipliers [静态] |
乘数序列 M (公开静态成员常量) |
constexpr round_consts [静态] |
轮次常量序列 C (公开静态成员常量) |
constexpr std::uint_least32_t default_seed [静态] |
20111115u (公开静态成员常量) |
成员函数
构造与播种 | |
| 构造引擎 (公开成员函数) | |
| 设置引擎的当前状态 (公开成员函数) | |
| 设置引擎的当前计数器 (公开成员函数) | |
生成 | |
| 推进引擎状态并返回生成的值 (公开成员函数) | |
| 令引擎状态前进指定量 (公开成员函数) | |
特征 | |
[静态] |
获取输出范围中的最小可能值 (公开静态成员函数) |
[静态] |
获取输出范围中的最大可能值 (公开静态成员函数) |
非成员函数
(C++26) |
比较两个伪随机数引擎的内部状态 (函数) |
(C++26) |
执行伪随机数引擎的流输入和输出 (函数模板) |
注解
| 功能特性测试宏 | 值 | 标准 | 功能特性 |
|---|---|---|---|
__cpp_lib_philox_engine |
202406L |
(C++26) | std::philox_engine
|
示例
| 本节未完成 原因:暂无示例 |