ページ 11

ボックスミュラー法による正規乱数の平均

Posted: 2011年6月23日(木) 17:25
by R5
ボックスミュラー法による正規乱数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: ボックスミュラー法による正規乱数の平均

Posted: 2011年6月23日(木) 19:16
by 初級者
とりあえず、

double k[1];

という定義はおかしいです。

Re: ボックスミュラー法による正規乱数の平均

Posted: 2011年6月24日(金) 10:41
by R5
ありがとうございます。
解決しました。
原因としてdouble型で配列は使用できないということでしょうか。

Re: ボックスミュラー法による正規乱数の平均

Posted: 2011年6月24日(金) 11:32
by 沖 滉均
R5 さんが書きました:原因としてdouble型で配列は使用できないということでしょうか。
違います。

double k[1];
これだと、要素1つの配列を定義しているのに対してコード上で
k[1]にアクセスしようとしているため範囲外アクセスになっています。

Re: ボックスミュラー法による正規乱数の平均

Posted: 2011年6月24日(金) 12:11
by non
R5 さんが書きました:ありがとうございます。
解決しました。
原因としてdouble型で配列は使用できないということでしょうか。
この質問では,どう解決したか心配になりますが,大丈夫でしょうか。

Re: ボックスミュラー法による正規乱数の平均

Posted: 2011年6月24日(金) 12:31
by R5
double k[1];

double k[2];
としたらよいということでしょうか。

ちなみに
double k1,k2;
と分けて解決しました。

Re: ボックスミュラー法による正規乱数の平均

Posted: 2011年6月24日(金) 12:52
by non
わかりました。それでOKです。