这个代码代表哪种分布?

时间:2016-05-03 09:05:14

标签: c++ statistics distribution normal-distribution

我正在阅读生成随机数的代码。但我不知道它是哪个发行版。谁能告诉我它是哪个发行版?

#include<cmath>
double rand(double min, double max)
{
    return min+(max-min)*rand()/(RAND_MAX+1.0);
}
double normal(double x, double miu,double sigma)
{
    return 1.0/sqrt(2*pi)/sigma*exp(-1*(x-miu)*(x-miu)/(2*sigma*sigma));
}
double randn(double miu,double sigma, double min ,double max)
{
    double x,y,dScope;
    do{
        x=rand(min,max);
        y=normal(x,miu,sigma);
        dScope=rand(0.0,normal(miu,miu,sigma));
    }while(dScope>y);
    return x;
}

我用参数(0,0.01,-0.6,0.6)调用了函数randn。我想知道randn代表哪个发行版?它让我很困惑,dScope用来做什么? 共有14951个样本。直方图如下: enter image description here

2 个答案:

答案 0 :(得分:2)

不,它不是正态分布(它从-Infinity到+ Infinity),而是截断正态分布,通过区间[min ... max]中的接受/拒绝方法进行采样。链接:https://en.wikipedia.org/wiki/Truncated_normal_distribution

答案 1 :(得分:0)

randn使用普通或高斯分布生成数字。钟形概率密度函数(您的直方图与它类似)是此分布的关键标识符。 https://en.wikipedia.org/wiki/Normal_distribution维基百科有关此分发的文章。