Я пытаюсь сгенерировать значения из нормального распределения, используя метод Монте-Карло, как на веб-сайте 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;
}
ОБНОВИТЬ
Очевидно, как указали пользователи, я облажался, и программа не работала из-за очень глупой ошибки.
Вы кажется вычислили mean
неправильно. mean
должны быть усреднены по N
в то время как вы суммируете только все элементы массива. ток mean
на самом деле sum
,
mean = mean /N
rand()
это генератор случайных чисел очень низкого качества в большинстве реализаций. Некоторые версии Linux будут иметь значение из пула энтропии ядра, но это не гарантируется для разных платформ (например, в Windows?). Вместо этого используйте Mersenne Twister. Boost библиотеки реализуют один.
РЕДАКТИРОВАТЬ: ответ Taocp выдвигает на первый план проблему кодирования, но проблема ГСЧ все еще применяется.