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
,类型为D
的(可能为 const)值 -
p
,类型为P
的(可能为 const)值 -
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() 并且由重复调用 x(g1) 和 y(g2) 生成的未来无限值序列将相等(只要 g1 == 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) 永久更改分布对象的参数,或者仅通过使用 d(g,p) 在单个 operator() 调用的持续时间内更改。
对分布的 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) |
在费舍尔 F 分布上产生实数值 (类模板) |
(C++11) |
在学生 t 分布上产生实数值 (类模板) |
(C++11) |
在离散分布上产生随机整数 (类模板) |
在恒定子区间上产生分布的实数值 (类模板) | |
在定义的子区间上产生分布的实数值 (类模板) |