命名空间
变体
操作

std::philox_engine

来自 cppreference.cn
< cpp‎ | numeric‎ | random
 
 
 
 
 
定义于头文件 <random>
template<

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

class philox_engine;
(since C++26)

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

目录

[编辑] 模板参数

UIntType - 生成器生成的结果类型。如果此类型不是 unsigned shortunsigned intunsigned longunsigned long long 之一,则效果未定义。
w - 以位为单位的字大小
n - 字计数
r - 轮计数
consts - 用于生成随机数的乘数和轮常数序列

如果以下任何值不是 true,则程序是非良构的

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

[编辑] 生成器属性

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

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

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

philox_engine转换算法 (TA(Xi)) 定义如下

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

philox_engine生成算法GA(Xi)=Yj

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

[编辑] 生成随机值

随机值从以下参数生成

  • 轮数 r
  • 当前计数器序列 X
  • 密钥序列 K
  • 乘数序列 M
  • 轮常数序列 C

序列 MC 由模板参数包 consts 中的值形成,它表示 MkCk 常数,形式为 [M0, C0, M1, C1,... , ..., Mn/2-1, Cn/2-1]

随机数通过以下过程生成

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

[编辑] 更新输出序列

对于每一轮更新,中间序列 V 以指定的顺序使用 S 的元素进行初始化

 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 为当前轮数(从零开始),对于 [0n / 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 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
(公共静态成员常量)

[编辑] 成员函数

构造与播种
构造引擎
(公共成员函数) [编辑]
设置引擎的当前状态
(公共成员函数) [编辑]
设置引擎的当前计数器
(公共成员函数) [编辑]
生成
推进引擎状态并返回生成的值
(公共成员函数) [编辑]
按指定量推进引擎状态
(公共成员函数) [编辑]
特性
[静态的]
获取输出范围内可能的最小值
(公共静态成员函数) [编辑]
[静态的]
获取输出范围内可能的最大值
(公共静态成员函数) [编辑]

[编辑] 非成员函数

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

[编辑] 注释

特性测试 Std 特性
__cpp_lib_philox_engine 202406L (C++26) std::philox_engine

[编辑] 示例