ウェブサイトhttp://math60082.blogspot.ca/2013/03/c-coding-random-numbers-and-monte-carlo.htmlに従って、モンテカルロ法を使用して正規分布から値を生成しようとしています
コードを元のコードから少し変更して、テストを個別に実行するのではなく、直接生成された数値の分散と平均を計算して、メソッドが機能しているかどうかを確認します (実際には同じ違いですが、注意が必要です)。
質問
私が何をしても、分散は 1 をはるかに上回り、平均はゼロではありません。生成された疑似乱数が十分にランダムでない可能性はありますか?
コード
上記の Web サイトの作成者は、コードを書いた人物であることに注意してください。
#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;
}
アップデート
どうやらユーザーが指摘したように、非常にばかげた間違いのために、私は失敗し、プログラムは機能しませんでした。