蒙特卡洛不够随意

时间:2013-05-08 00:32:00

标签: c++ montecarlo

我正在尝试使用monte carlo方法从正态分布生成值,根据网站http://math60082.blogspot.ca/2013/03/c-coding-random-numbers-and-monte-carlo.html

我将代码从原始代码中稍微修改一下,因此它会计算方差和直接生成的数字的平均值,以检查方法是否正常工作而不是单独进行测试(实际上相同的区别只是抬头)。

问题

无论我做什么,方差都高于1,均值不为零。生成的伪随机数是否可能不够随机?

代码

请注意,上述网站的作者是签署该代码的人

#include <cstdlib>
#include <cmath>
#include <ctime>
#include <iostream>
using namespace std;
// return a uniformly distributed random number
double uniformRandom()
{
    return ( (double)(rand()) + 1. )/( (double)(RAND_MAX) + 1. );
}

// return a normally distributed random number
double normalRandom()
{
    double u1=uniformRandom();
    double u2=uniformRandom();
    return cos(8.*atan(1.)*u2)*sqrt(-2.*log(u1)); 
}

int main()
{
    double z;
    int N=1000;
    double array[N];
    double mean=0 ,variance=0;
    srand(time(NULL));

    for(int i=0;i<N;i++)
    {
        z=normalRandom();
        cout << i << "->"<< z<< endl;
        mean+=z;
        array[i]=z;
    }

    mean=mean/N ;
    cout << " mean = " << mean << endl;

    for(int i=0;i<N;i++)
    {
        variance = variance + (mean - array[i])*(mean - array[i]);
    }
    variance = variance/N;
    cout << " variance = " << variance << endl;

    return 0;
}

更新

显然,正如用户指出的那样,我搞砸了,因为一个非常愚蠢的错误,程序无法运行。

2 个答案:

答案 0 :(得分:3)

您似乎以错误的方式计算了meanmean的平均值应超过N,而您只对所有数组元素求和。当前mean实际上是sum

mean = mean /N

答案 1 :(得分:2)

在大多数实现中,

rand()是一个质量非常低的随机数生成器。一些Linux版本会从内核熵池中获取价值,但是不能跨平台保证(例如在Windows上?)使用Mersenne Twister代替。 Boost库实现了一个。

编辑:taocp回答强调编码问题,但RNG问题仍然适用。