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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
R5

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

#1

投稿記事 by R5 » 14年前

ボックスミュラー法による正規乱数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;
}

初級者
記事: 200
登録日時: 14年前

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

#2

投稿記事 by 初級者 » 14年前

とりあえず、

double k[1];

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

R5

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

#3

投稿記事 by R5 » 14年前

ありがとうございます。
解決しました。
原因としてdouble型で配列は使用できないということでしょうか。

アバター
沖 滉均
記事: 237
登録日時: 14年前
住所: K県F市

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

#4

投稿記事 by 沖 滉均 » 14年前

R5 さんが書きました:原因としてdouble型で配列は使用できないということでしょうか。
違います。

double k[1];
これだと、要素1つの配列を定義しているのに対してコード上で
k[1]にアクセスしようとしているため範囲外アクセスになっています。
There is no royal road to learning.
codeタグで指定できる言語
画像

non
記事: 1097
登録日時: 14年前

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

#5

投稿記事 by non » 14年前

R5 さんが書きました:ありがとうございます。
解決しました。
原因としてdouble型で配列は使用できないということでしょうか。
この質問では,どう解決したか心配になりますが,大丈夫でしょうか。
non

R5

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

#6

投稿記事 by R5 » 14年前

double k[1];

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

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

non
記事: 1097
登録日時: 14年前

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

#7

投稿記事 by non » 14年前

わかりました。それでOKです。
non

閉鎖

“C言語何でも質問掲示板” へ戻る