我正在尝试生成一系列符合指数分布的随机数。幸运的是,C ++提供了这样的模板类exponential_distribution,它可以根据指数分布生成浮点值,提供平均值的倒数(即到达率)。

另一方面,每个生成的值表示两个随机事件之间的间隔,该事件是独立的,但在统计上由恒定的平均到达率(即其λ)来定义。因此,lambda是平均值的倒数。

生成这样的随机值之后,我想检查生成的随机数是否正确,因此我根据生成的随机数lambda' = the number of generated randoms (number of arrivals)/the sum of the generated randoms (time duration)计算到达率,即到达率。

但是,结果表明lambdalambda'非常不同。以下是我的代码,其中lambda=20.0

#include<iostream>
#include<random>
#include<fstream>
#include<map>
using namespace std;

int main(){

    mt19937 mt; //The Mersenne Twister is a pseudorandom number generator (PRNG), default_seed is a member constant, defined as 5489u;
    exponential_distribution<double> exponential_intervals(20.0);
        double interval;
        double timestamp = 0;
        for(int j = 0; j < 20; j ++){
            interval = exponential_intervals(mt);
            cout<<interval<<endl;
            timestamp += interval;  //generate exponentional distribution randoms, in micro seconds

        }

    return 0;
}


生成的随机数是:

0.118112
0.0900931
0.00679023
0.173476
0.122309
0.0124894
0.0500325
0.0184205
0.00513157
0.0396175
0.016321
0.0104363
0.0395801
0.247252
0.157921
0.2822
0.167461
0.171627


总和是1.82,所以是lambda'=20/1.82=10.98,它与lambda截然不同。

有人可以告诉我如何提高生成的随机数的准确性吗?

最佳答案

分布的标准偏差与平均值mu = 1/lambda相同。记住中心极限定理,对于样本大小N,样本均值的偏差大约为mu/sqrt(N)。对于20的样本量,这是相当大的-大约是您所测量的值的22%-因此您可能会得出相当不准确的估计值。

将样本大小增加到10000,以提供大约1%的偏差,可以得出更好的估计值:http://ideone.com/9xjQwg

关于c++ - C++ exponential_distribution模板类生成不准确的随机数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26687840/

10-11 22:53
查看更多