не случайно для Монте-Карло

Я пытаюсь сгенерировать значения из нормального распределения, используя метод Монте-Карло, как на веб-сайте 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

Решение

Вы кажется вычислили mean неправильно. mean должны быть усреднены по Nв то время как вы суммируете только все элементы массива. ток mean на самом деле sum,

mean = mean /N
3

Другие решения

rand() это генератор случайных чисел очень низкого качества в большинстве реализаций. Некоторые версии Linux будут иметь значение из пула энтропии ядра, но это не гарантируется для разных платформ (например, в Windows?). Вместо этого используйте Mersenne Twister. Boost библиотеки реализуют один.

РЕДАКТИРОВАТЬ: ответ Taocp выдвигает на первый план проблему кодирования, но проблема ГСЧ все еще применяется.

2

По вопросам рекламы [email protected]