C++ 命名需求: RandomNumberDistribution (自 C++11 起)
来自 cppreference.com
一个 RandomNumberDistribution 是一个函数对象,根据 概率密度函数 p(x) 或 离散概率分布 P(x
i) 返回随机数。
[编辑] 要求
如果类型 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 的参数的当前值决定的,x 的 operator() 可能返回的值的最小上限。 |
常量 |
x.max() |
T |
由 x 的参数的当前值决定的,x 的 operator() 可能返回的值的最大上限。 |
常量 |
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()
调用期间更改。
对分布的常量成员函数和 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) |
在离散分布上生成随机整数 (类模板) |
在常数子区间上生成分布的实数值 (类模板) | |
在定义的子区间上生成分布的实数值 (类模板) |