ボックスミュラー法による正規乱数の平均
Posted: 2011年6月23日(木) 17:25
ボックスミュラー法による正規乱数100000個の平均を求める問題なのですが、
理論値は0になるのに自分で作ったプログラムでは少し違う数値 0.41....が出てきます。
どこがおかしいのか教えていただけないでしょうか。
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int main(void)
{
double a=1229;
double c=351750;
double m=1664501;
double r=2314;
double k[1];
double g=0;
double o,o2;
int i;
for(i=0;i<100000;i++)
{
if(i%2 == 0)
{
k[0]=0;
k[1]=0;
r=fmod(a*r+c,m);
o=r/m;
r=fmod(a*r+c,m);
o2=r/m;
k[0]=sqrt(-2.0 * log(o)) * cos(2.0 * 3.1415926535 * o2);
k[1]=sqrt(-2.0 * log(o)) * sin(2.0 * 3.1415926535 * o2);
g=g+(k[0]+k[1]);
}
}
g=g/100000;
printf("average=%f\n",g);
return 0;
}
理論値は0になるのに自分で作ったプログラムでは少し違う数値 0.41....が出てきます。
どこがおかしいのか教えていただけないでしょうか。
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int main(void)
{
double a=1229;
double c=351750;
double m=1664501;
double r=2314;
double k[1];
double g=0;
double o,o2;
int i;
for(i=0;i<100000;i++)
{
if(i%2 == 0)
{
k[0]=0;
k[1]=0;
r=fmod(a*r+c,m);
o=r/m;
r=fmod(a*r+c,m);
o2=r/m;
k[0]=sqrt(-2.0 * log(o)) * cos(2.0 * 3.1415926535 * o2);
k[1]=sqrt(-2.0 * log(o)) * sin(2.0 * 3.1415926535 * o2);
g=g+(k[0]+k[1]);
}
}
g=g/100000;
printf("average=%f\n",g);
return 0;
}