C++ 参考手册

位置:首页 > C++ 参考手册 >数值库 >伪随机数生成 > std::exponential_distribution

定义于头文件 <random>
template< class RealType = double >
class exponential_distribution;
(C++11 起)

产生随机浮点值 x ,分布服从概率密度函数:

P(x|λ) = λe-λx

若随机事件以常数频率 λ 于每个时间/距离单位发生,则获得的值为直至下次随机事件的时间/距离。例如,此分布描述盖革计数器的点击间的时间,或 DNA 链中变异点间的距离。

这是 std::geometric_distribution 的连续对应。

std::exponential_distribution 满足随机数分布 (RandomNumberDistribution)

模板形参

RealType - 生成器所生成的结果类型。若它不是 floatdoublelong double 之一则效果未定义。


成员类型

 
成员类型 定义
result_type RealType
param_type 参数集的类型,见随机数分布 (RandomNumberDistribution)

成员函数

构造新分布
(公开成员函数)
重置分布的内部状态
(公开成员函数)
生成
生成分布中的下个随机数
(公开成员函数)
特征
返回 lambda 分布参数(事件频率)
(公开成员函数)
获取或设置随机参数对象
(公开成员函数)
返回最小的潜在生成值
(公开成员函数)
返回最大的潜在生成值
(公开成员函数)

非成员函数

比较两个分布对象
(函数)
执行伪随机数分布的流输入和输出
(函数模板)

注意

RealTypefloat ,则一些实现有时会返回无穷大。此为 LWG 问题 2524

示例

#include <iostream>
#include <iomanip>
#include <string>
#include <map>
#include <random>
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 p : hist) {
        std::cout << std::fixed << std::setprecision(1) 
                  << p.first/2.0 << '-' << (p.first+1)/2.0 <<
                ' ' << std::string(p.second/200, '*') << '\n';
    }
}

可能的输出:

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 。