電子書籍の厳選無料作品が豊富!

正規分布する乱数プログラムを作りたいのですが、うまく作れません・・。

プログラムソースは長くなりますので見ていただかなくても結構なのですが、下記のようなプログラムを実行したところ、実行結果下記になり、正規分布にはなりませんでした・・。

色々ネットで調べたものの理解できないのでどなたか教えていただけないでしょうか><

正規分布を利用して、例えば50~100位の間に分布する乱数を生成したりしたいのです。。。



#include <math.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>

#define PI 3.14159265358979323846264

double p_nor(){
double rnd,t,u,r1,r2;
rnd=rand()%10000/10000.0;
t=sqrt(-2.0 * log(1-rnd));
u=2*PI*rnd;
r1=t*sin(u);
return r1;
}


int main(){
int i,bunpu[30]={};
double p,min=0,max=0,total=0;
srand((unsigned)time(NULL));
for(i=0;i<100000;i++){
p=p_nor();
for(int j=0;j<30;j++){
if(p>-2.0+0.1*j && p<=-1.9+0.1*j)
bunpu[j]++;
}
if(min>p)min=p;
if(max<p)max=p;
total+=p;
}

printf("min:%fmax%f平均%f\n",min,max,total/100000);

for(int j=0;j<30;j++){
for(i=0;i<bunpu[j]/200;i++){
printf("*");
}
printf("\n");
}
return 0;
}
実行結果
min:-1.711381 max0.803275 平均-0.247841


****************
************************************
********************
****************
**************
************
***********
**********
**********
*********
*********
********
********
********
********
********
********
********
*************************************
*************************
***********************
***********************
************************
****************************
********************************
****************************************************************
***********

A 回答 (1件)

> rnd=rand()%10000/10000.0;


> t=sqrt(-2.0 * log(1-rnd));
> u=2*PI*rnd;

tとuを計算する際、1つのrndを使っているのがまずいと思います。
引用したいちばん上のrndの計算式を2番目と3番目の間にも書いて、
tを計算するときの乱数とuを計算するときの乱数とを
別々にしなければならないと思います。
    • good
    • 0
この回答へのお礼

解決いたしました。ありがとうございました。

お礼日時:2007/04/01 15:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報