C++ 命名要求
RandomNumberDistribution (C++11 起)
一个 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() 并且只要 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)
永久改变,或者通过使用 d(g,p)
仅在单个 operator() 调用期间改变。
对分布的 const 成员函数和 os << d
的调用不会影响重复 d(g)
产生的数字序列。
标准库
以下标准库组件满足 RandomNumberDistribution
pub | uniform_int_distribution(C++11) | 在给定范围内均匀分布生成整数值 |
pub | uniform_real_distribution(C++11) | 在给定范围内均匀分布生成实数值 |
pub | bernoulli_distribution(C++11) | 根据伯努利分布生成布尔值 |
pub | binomial_distribution(C++11) | 根据二项分布生成整数值 |
pub | negative_binomial_distribution(C++11) | 根据负二项分布生成整数值 |
pub | geometric_distribution(C++11) | 根据几何分布生成整数值 |
pub | poisson_distribution(C++11) | 根据泊松分布生成整数值 |
pub | exponential_distribution(C++11) | 根据指数分布生成实数值 |
pub | gamma_distribution(C++11) | 根据伽马分布生成实数值 |
pub | weibull_distribution(C++11) | 根据威布尔分布生成实数值 |
pub | extreme_value_distribution(C++11) | 根据极值分布生成实数值 |
pub | normal_distribution(C++11) | 根据标准正态(高斯)分布生成实数值 |
pub | lognormal_distribution(C++11) | 根据对数正态分布生成实数值 |
pub | chi_squared_distribution(C++11) | 根据卡方分布生成实数值 |
pub | cauchy_distribution(C++11) | 根据柯西分布生成实数值 |
pub | fisher_f_distribution(C++11) | 根据费舍尔F分布生成实数值 |
pub | student_t_distribution(C++11) | 根据学生t分布生成实数值 |
pub | discrete_distribution(C++11) | 在离散分布上生成随机整数 |
pub | piecewise_constant_distribution(C++11) | 在常量子区间上生成实数值 |
pub | piecewise_linear_distribution(C++11) | 在定义的子区间上生成实数值 |