Namespaces
Variants

std:: philox_engine

From cppreference.net
定义于头文件 <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 - 用于生成随机数的乘数及轮常量序列

如果以下任一值不为 true ,则程序格式错误:

生成器属性

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

philox_engine 状态 大小为 O(n) ,每个状态由四部分组成:

  • 一个由 n 个整数值构成的序列 X ,其中每个值的取值范围为 [ 0 , 2 w
    )
  • 该序列表示一个大型无符号整数计数器值 Z=∑ n-1
    j=0
    X⋅2 wj
    ,位宽为 n⋅w 位。
  • 一个由 n / 2 UIntType 类型密钥组成的序列 K
  • 一个包含 n UIntType 类型生成值的缓冲区 Y
  • Y 缓冲区中的索引 j

philox_engine 状态转移算法 TA(X i ) )定义如下:

  • 如果 j 不等于 n - 1 ,则将 j 增加 1 [1]
  • 如果 j 等于 n - 1 ,则执行以下操作: [2]
  1. 生成一个包含 n 个随机值的新序列(详见下文),并将其存储在 Y 中。
  2. 将计数器 Z 的值增加 1
  3. j 重置为 0

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

  1. 在此情况下,下一代算法调用返回缓冲区中的下一个生成值。
  2. 在此情况下,缓冲区被刷新,下一代算法调用返回新缓冲区中的第一个值。

生成随机值

随机值根据以下参数生成:

  • 轮数 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

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

  1. 将输出序列 S 初始化为 X 的元素。
  2. S 的元素进行 r 轮更新。
  3. 将缓冲区 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
说明: - 保留了所有HTML标签、属性和数学公式标签内容 - 仅将表格中的英文文本"N/A"翻译为"不适用" - 未翻译C++代码标签内的内容(如`n`、`2`、`4`) - 保持了原始格式和样式属性

给定以下操作符号:

  • 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)
比较两个伪随机数引擎的内部状态
(函数)
对伪随机数引擎执行流输入和输出操作
(函数模板)

注释

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

示例