我正在尝试使用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;
}
更新
显然,正如用户指出的那样,我搞砸了,因为一个非常愚蠢的错误,程序无法运行。
答案 0 :(得分:3)
您似乎以错误的方式计算了mean
。 mean
的平均值应超过N
,而您只对所有数组元素求和。当前mean
实际上是sum
。
mean = mean /N
答案 1 :(得分:2)
rand()
是一个质量非常低的随机数生成器。一些Linux版本会从内核熵池中获取价值,但是不能跨平台保证(例如在Windows上?)使用Mersenne Twister代替。 Boost库实现了一个。
编辑:taocp回答强调编码问题,但RNG问题仍然适用。