std:: philox_engine
|
定义于头文件
<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
- 0 < r
- 0 < w && w <= std:: numeric_limits < UIntType > :: digits
生成器属性
在以下描述中,令 Q i 表示序列 Q 的第 i 个元素,其中下标从零开始。
philox_engine
的
状态
大小为
O(n)
,每个状态由四部分组成:
-
一个由
n
个整数值构成的序列
X
,其中每个值的取值范围为
[ 0 ,2w
)。
-
-
该序列表示一个大型无符号整数计数器值
Z=∑
n-1
j=0 X⋅2 wj
,位宽为 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
0
,
C
0
,
M
1
,
C
1
,... , ...,
M
n/2-1
,
C
n/2-1
]
的形式分别表示常量
M
k
和
C
k
。
随机数通过以下过程生成:
- 将输出序列 S 初始化为 X 的元素。
- 对 S 的元素进行 r 轮更新。
- 将缓冲区 Y 中的值替换为 S 中的值。
更新输出序列
在每一轮更新中,会按照指定顺序使用 S 的元素初始化一个中间序列 V :
| n | V 0 | V 1 | V 2 | V 3 |
|---|---|---|---|---|
| 2 | S 0 | S 1 | 不适用 | |
| 4 | S 2 | S 1 | S 0 | S 3 |
给定以下操作符号:
- xor ,内置的 按位异或 运算符。
-
mullo
,计算模乘法的低半部分,定义为
mullo(a,b,w)=(a⋅b) mod 2
w
。 -
mulhi
,计算乘法的高半部分,定义为
mulhi(a,b,w)=⌊(a⋅b)/2
w
⌋ 。
设
q
为当前轮次编号(从零开始),对于每个在区间
[
0
,
n
/
2
)
内的整数
k
,输出序列
S
的元素按以下方式更新:
-
X
2⋅k
=mulhi(V
2⋅k
,M
k
,w) xor ((K
k
+q⋅C
k
) mod 2
w
) xor V 2⋅k+1 - X 2⋅k+1 =mullo(V 2⋅k ,M k ,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
[static]
|
w
(公开静态成员常量) |
|
constexpr
std::size_t
word_count
[static]
|
n
(公开静态成员常量) |
|
constexpr
std::size_t
round_count
[static]
|
r
(公开静态成员常量) |
|
constexpr
std::
array
<
result_type, word_count
/
2
>
multipliers
[static]
|
乘数序列
M
(公开静态成员常量) |
|
constexpr
std::
array
<
result_type, word_count
/
2
>
round_consts
[static]
|
轮常量序列
C
(公开静态成员常量) |
|
constexpr
std::uint_least32_t
default_seed
[static]
|
20111115u
(公开静态成员常量) |
成员函数
构造与播种 |
|
|
构造引擎
(公开成员函数) |
|
|
设置引擎的当前状态
(公开成员函数) |
|
|
设置引擎的当前计数器
(公开成员函数) |
|
生成 |
|
|
推进引擎状态并返回生成的值
(公开成员函数) |
|
|
按指定量推进引擎状态
(公开成员函数) |
|
特性 |
|
|
[static]
|
获取输出范围中的最小可能值
(公开静态成员函数) |
|
[static]
|
获取输出范围中的最大可能值
(公开静态成员函数) |
非成员函数
|
(C++26)
|
比较两个伪随机数引擎的内部状态
(函数) |
|
(C++26)
|
对伪随机数引擎执行流输入和输出操作
(函数模板) |
注释
| 功能测试 宏 | 值 | 标准 | 功能 |
|---|---|---|---|
__cpp_lib_philox_engine
|
202406L
|
(C++26) |
std::philox_engine
|
示例
|
本节内容不完整
原因:缺少示例 |