std::exponential_distribution
来自cppreference.com
在标头 <random> 定义
|
||
template< class RealType = double > class exponential_distribution; |
(C++11 起) | |
产生随机浮点值 x,分布服从概率密度函数:
- P(x|λ) = λe-λx
若随机事件以常数频率 λ 于每个时间/距离单位发生,则获得的值为直至下次随机事件的时间/距离。例如,此分布描述盖革计数器的点击间的时间,或 DNA 链中变异点间的距离。
这是 std::geometric_distribution 的连续对应。
std::exponential_distribution
满足随机数分布 (RandomNumberDistribution) 。
模板形参
RealType | - | 生成器所生成的结果类型。如果它不是 float、double 或 long double 之一,那么效果未定义。 |
成员类型
成员类型 | 定义 |
result_type (C++11)
|
RealType |
param_type (C++11)
|
参数集的类型,见随机数分布 (RandomNumberDistribution) 。 |
成员函数
(C++11) |
构造新分布 (公开成员函数) |
(C++11) |
重置分布的内部状态 (公开成员函数) |
生成 | |
(C++11) |
生成分布中的下个随机数 (公开成员函数) |
特征 | |
(C++11) |
返回 lambda 分布参数(事件频率) (公开成员函数) |
(C++11) |
获取或设置随机参数对象 (公开成员函数) |
(C++11) |
返回最小的潜在生成值 (公开成员函数) |
(C++11) |
返回最大的潜在生成值 (公开成员函数) |
非成员函数
(C++11)(C++11)(C++20 中移除) |
比较两个分布对象 (函数) |
(C++11) |
执行伪随机数分布的流输入和输出 (函数模板) |
注解
若 RealType
为 float,则一些实现有时会返回无穷大。此为 LWG 问题 2524。
示例
|code=
- include <iomanip>
- include <iostream>
- include <map>
- include <random>
- include <string>
int main() {
std::random_device rd; std::mt19937 gen(rd());
// 若粒子平均每秒衰变一次, // 则到下个衰变前要多少秒的时间? std::exponential_distribution<> d(1); std::map<int, int> hist; for (int n = 0; n != 10000; ++n) ++hist[2 * d(gen)];
for (auto const& [x, y] : hist) std::cout << std::fixed << std::setprecision(1) << x / 2.0 << '-' << (x + 1) / 2.0 << ' ' << std::string(y / 200, '*') << '\n';
} |p=true |output= 0.0-0.5 ******************* 0.5-1.0 *********** 1.0-1.5 ******* 1.5-2.0 **** 2.0-2.5 ** 2.5-3.0 * 3.0-3.5 3.5-4.0 }}
外部链接
Weisstein, Eric W. “指数分布。”来自 MathWorld--A Wolfram Web Resource。 |