C++ 如何随机生成平均值为0、标准偏差为1的双精度数组?

C++ 如何随机生成平均值为0、标准偏差为1的双精度数组?,c++,random,statistics,C++,Random,Statistics,对于我的家庭作业,我将生成一组固定点的数字,允许平均值为0,标准偏差为1。我主要是处理一系列的双打来尝试这一点,但我不知道如何做到这一点 为了生成这些值,我尝试使用Box-Muller方法,但最终得到的平均值和标准偏差仍然与标准正态分布的平均值=1和标准偏差=1不符 更新:好吧,我刚刚意识到我的错误。对于box muller,我将2错误地输入为3。现在解决了这个问题 //Create Standard Normal Distribution void std_find(double a[],do

对于我的家庭作业,我将生成一组固定点的数字,允许平均值为0,标准偏差为1。我主要是处理一系列的双打来尝试这一点,但我不知道如何做到这一点

为了生成这些值,我尝试使用Box-Muller方法,但最终得到的平均值和标准偏差仍然与标准正态分布的平均值=1和标准偏差=1不符

更新:好吧,我刚刚意识到我的错误。对于box muller,我将2错误地输入为3。现在解决了这个问题

//Create Standard Normal Distribution
void std_find(double a[],double s[], int pop, int samp){//
    //generate random numbers for std normal
    double *p;
    p = a;
    //generate numbers in standard normal
    double numA = 0;
    double numB = 0;
    double PI = 3.14159;
    //Box_Muller
    for(int i = 0; i < pop; i= i+2){
        numA = (rand() * 1)/(double)32767;
        numB = (rand() * 1)/(double)32767;
        *p = sqrt((double)-3 * (log(numB))) * cos((double)3* PI*numA);
        p++;
        *p = sqrt((double)-3 * (log(numB))) * sin((double)3 *PI*numA);
        p++;
    }
    double popMean = mean(a,(double)pop);
    //double popMean = (double)0;
    double popSD = sqrt(sampleV(a,pop));
    //double popSD = (double)1;
    cout << "\nPopulation Mean of the std: " << popMean;
    cout << "\nPopulation Standard deviance of std: " << popSD;
    //population created, now to create sample
    sample(a,s,samp,popMean,popSD);
    }
//创建标准正态分布
void std_find(双a[],双s[],int pop,int samp){//
//为std normal生成随机数
双*p;
p=a;
//以标准法线生成数字
双numA=0;
双麻木=0;
双PI=3.14159;
//博克斯穆勒
对于(int i=0;i双打的阵法是最简单的,对吗

您需要找到的是一种从标准化高斯分布中提取随机数的方法

也许你应该看看这个:


一个很好的通用方法是生成遵循标准正态分布(定义为µ=0和σ=1的正态分布)的数字。请查看正态分布的定义,特别是“从正态分布生成值”一节.

给定的结果集满足这些标准是否重要(在这种情况下,最后一个数字不再是随机的),或者生成器应该为无限数量的值执行此操作?严格地说,您不需要这样做,还有许多其他分布的均值为0,方差为1。例如,在+/-sqrt(3)范围内的均匀分布。但我认为你是对的,这就是提问者的意思:-)足够公平,编辑以澄清这只是解决问题的一种合理方法。我同意@SteveJessop。鉴于大多数PRV生成器是一致的,对均匀分布的“随机”数进行简单的线性变换将是最简单的解决方案。