는 내가 코드를 원본과 약간의 수정 된 웹 사이트 http://math60082.blogspot.ca/2013/03/c-coding-random-numbers-and-monte-carlo.html임의하지 몬테 카를로에 대한
에 따라이 분산을 계산하므로, 몬테카를로 방법을 사용하여 정규 분포의 값을 생성하기 위해 노력하고 의미하고 메소드가 별도로 테스트하지 않고 작동하는지 확인하기 위해 직접 생성 된 숫자 (동일한 차이가 있지만 실제로는 머리가 맞지 않음).
에 관계없이 내가하는 일의 질문, 분산은 위의 방법 1이고 평균이 0이 아닌. 생성 된 의사 난수가 충분히 랜덤하지 않을 수도 있습니까?
코드
위의 특정 웹 사이트의 저자는 사용자가 지적하는 코드
#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;
}
UPDATE 분명히
을 작성한 사람이므로주의 해주십시오, 나는 어리석은 실수로 프로그램이 작동하지 않고 망쳐 버렸습니다.
내가 균일 한 랜덤에서 무작위로 정규 분포를 생성하는 일반적으로 특히 정확하지 않은 것을 과거에 읽은 - 더는 정규 분포 RNG를 사용합니다. (정확히 어디에서 하나를 찾을 지 모르겠지만, C++에 대해서는 모른다.) –
@HotLicks : 내가 읽은 곳을 모르지만, 그것은 매우 불안정하다. 정규 분포가 정규 분포를 이루는 것은 꽤 일반적입니다 (http://en.wikipedia.org/wiki/Marsaglia_polar_method) [thing] (http://en.wikipedia.org/wiki/Box%E2%80) % 93Muller_transform). * 그러나 *, (rand()와 같이) 불규칙한 uniform generator를 사용하면 정규 분포가 좋지 않습니다. –
@HotLicks Noted, 분명히 내가 이것을하고있는 친구는 그것이 몬테 카를로 방법이되기를 바란다. –