C++ 命名需求: RandomNumberDistribution (自 C++11 起)
来自 cppreference.cn
一个 RandomNumberDistribution 是一个函数对象,根据概率密度函数 p(x) 或离散概率分布 P(xi) 返回随机数。
[编辑] 要求
类型 D
满足 RandomNumberDistribution,如果
-
D
满足 CopyConstructible -
D
满足 CopyAssignable
给定
-
T
,由 D::result_type 命名的类型 -
P
,由 D::param_type 命名的类型,它
- 满足 CopyConstructible
- 满足 CopyAssignable
- 满足 EqualityComparable
- 具有与
D
的每个构造函数(接受对应于分布参数的参数)相同的构造函数。 - 具有与
D
的每个返回分布参数的成员函数相同的名称、类型和语义的成员函数 - 声明一个成员 typedef using distribution_type = D;
-
d
,一个类型为D
的值 -
x
和y
,(可能为 const)类型为D
的值 -
p
,一个(可能为 const)类型为P
的值 -
g
、g1
、g2
,满足 UniformRandomBitGenerator 类型的左值 -
os
,std::basic_ostream 特化类型的左值 -
is
,std::basic_istream 特化类型的左值
以下表达式必须有效并具有其指定的效果
表达式 | 类型 | 注意 | 复杂度 |
---|---|---|---|
D::result_type |
T |
一个算术类型 | 编译时 |
D::param_type |
P |
编译时 | |
D() |
创建一个与任何其他默认构造的 D 无法区分的分布 |
常量 | |
D(p) |
创建一个与直接从用于构造 p 的值构造的 D 无法区分的分布 |
与 p 的构造相同 | |
d.reset() |
void |
重置分布的内部状态。对 d 的下一次 operator() 调用将不依赖于 reset() 之前任何引擎产生的值 |
常量 |
x.param() |
P |
返回 p ,使得 D(p).param() == p |
不比 D(p) 差 |
d.param(p) |
void |
后置条件: d.param() == p | 不比 D(p) 差 |
d(g) |
T |
使用相同 g 连续调用此函数所返回的数字序列,按照 d.param() 参数化的分布随机分布 |
对 g 的平摊常数次调用 |
d(g,p) |
T |
使用相同 g 连续调用此函数所返回的数字序列,按照 p 参数化的分布随机分布 |
对 g 的平摊常数次调用 |
x.min() |
T |
由 x 的 operator() 可能返回的值的最大下界,由 x 参数的当前值决定 |
常量 |
x.max() |
T |
由 x 的 operator() 可能返回的值的最小上界,由 x 参数的当前值决定 |
常量 |
x == y |
bool |
建立等价关系。如果 x.param() == y.param() 并且只要 g1 == g2,重复调用 x(g1) 和 y(g2) 将生成的未来无限值序列相等,则返回 true |
常量 |
x != y |
bool |
!(x == y) |
常量 |
os << x |
os 类型的引用 |
将分布参数和内部状态的文本表示写入 os 。os 的格式标志和填充字符保持不变 |
|
is >> d |
is 类型的引用 |
从 is 读取数据以恢复分布参数和内部状态。is 的格式标志保持不变。数据必须使用具有相同区域设置、CharT 和 Traits 流模板参数的流写入,否则行为未定义。如果遇到错误输入,则调用 is.setstate(std::ios::failbit),这可能会抛出 std::ios_base::failure。在这种情况下,d 保持不变 |
[编辑] 注意
分布对象的参数可以通过使用 d.param(p) 永久更改,或者仅在单次 operator()
调用期间通过使用 d(g,p) 更改。
对分布的 const 成员函数和 os << d 的调用不会影响重复调用 d(g) 产生的数字序列。
[编辑] 标准库
以下标准库组件满足 RandomNumberDistribution
(C++11) |
产生在给定范围内均匀分布的整数值 (类模板) |
(C++11) |
产生在给定范围内均匀分布的实数值 (类模板) |
(C++11) |
在伯努利分布上产生 bool 值 (类) |
(C++11) |
根据 二项分布 生成整数值 (类模板) |
根据 负二项分布 生成整数值 (类模板) | |
(C++11) |
根据 几何分布 生成整数值 (类模板) |
(C++11) |
在泊松分布上产生整数值 (类模板) |
(C++11) |
根据 指数分布 生成实数值 (类模板) |
(C++11) |
根据 伽马分布 生成实数值 (类模板) |
(C++11) |
根据 威布尔分布 生成实数值 (类模板) |
(C++11) |
根据 极值分布 生成实数值 (类模板) |
(C++11) |
根据 标准正态(高斯)分布 生成实数值 (类模板) |
(C++11) |
根据 对数正态分布 生成实数值 (类模板) |
(C++11) |
根据 卡方分布 生成实数值 (类模板) |
(C++11) |
根据 柯西分布 生成实数值 (类模板) |
(C++11) |
根据 Fisher's F-分布 生成实数值 (类模板) |
(C++11) |
根据 Student's t-分布 生成实数值 (类模板) |
(C++11) |
在离散分布上产生随机整数 (类模板) |
在常数子区间上生成分布的实数值 (类模板) | |
在定义子区间上生成分布的实数值 (类模板) |