ボックスミュラー法による正規乱数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;
}
ボックスミュラー法による正規乱数の平均
Re: ボックスミュラー法による正規乱数の平均
違います。R5 さんが書きました:原因としてdouble型で配列は使用できないということでしょうか。
double k[1];
これだと、要素1つの配列を定義しているのに対してコード上で
k[1]にアクセスしようとしているため範囲外アクセスになっています。
Re: ボックスミュラー法による正規乱数の平均
この質問では,どう解決したか心配になりますが,大丈夫でしょうか。R5 さんが書きました:ありがとうございます。
解決しました。
原因としてdouble型で配列は使用できないということでしょうか。
non
Re: ボックスミュラー法による正規乱数の平均
double k[1];
を
double k[2];
としたらよいということでしょうか。
ちなみに
double k1,k2;
と分けて解決しました。
を
double k[2];
としたらよいということでしょうか。
ちなみに
double k1,k2;
と分けて解決しました。