0

ウェブサイト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;
}

アップデート

どうやらユーザーが指摘したように、非常にばかげた間違いのために、私は失敗し、プログラムは機能しませんでした。

4

2 に答える 2

2

rand()ほとんどの実装では、非常に低品質の乱数ジェネレーターです。一部の Linux バージョンは、カーネル エントロピー プールから値を取得しますが、プラットフォーム間で保証されていません (Windows など)。代わりに、Mersenne Twister を使用してください。Boost ライブラリはいずれかを実装します。

編集: taocp の回答はコーディングの問題を強調していますが、RNG の問題は引き続き適用されます。

于 2013-05-08T00:36:12.790 に答える