みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

動いているのに…

学校の課題で、
ランダム関数を使って、
πの近似値を求めようという課題が出されました。

そして、私は、
#include<stdio.h>
#include<stdlib.h>
double pai_calc(int n);//乱数を発生させて、近似値と求める

int main(void){

int i,n;//nは発生させる乱数の数

for(i=0;i<=5;i++){
if(i==0)
n=10;
else if(i==1)
n=100;
else if(i==2)
n=1000;
else if(i==3)
n=2000;
else if(i==4)
n=5000;
else
n=10000;

printf("pai approx.[%d]=%f\n",n,pai_calc(n));

}
return(0);
}

double pai_calc(int n){
double rndx,rndy,pai,m=0;
int i;
for(i=1;i<=n;i++){
rndx=(float)rand()/32768.0;//1以下の少数を発生させる
rndy=(float)rand()/32768.0;
if((rndx*rndx+rndy*rndy)<=1)
m++;
}
pai=4*m/n;
return(pai);}

このように作って、結果も
pai approx.[10]=3.200000
pai approx.[100]=3.280000
pai approx.[1000]=3.148000
pai approx.[2000]=3.148000
pai approx.[5000]=3.120800
pai approx.[10000]=3.139600
となったのですが、

先生のPC上では、
pai approx.[10]=0.000000
pai approx.[100]=0.000000
pai approx.[1000]=0.000000
pai approx.[2000]=0.000000
pai approx.[5000]=0.000000
pai approx.[10000]=0.000000
となるそうです。
(つまり失格とのこと)
私のパソコンでは、それぞれ近似値がでたのに、
どうしてでしょうか??
理解できません。
また、1以下の少数を発生させるのに、
マジックナンバー32768.0を使うな
といわれましたが、これを他の方法で置き換えることが
できません。
初心者で、まことに申し訳ございませんが、
ご教授ください。

投稿日時 - 2007-12-21 16:20:31

QNo.3616536

困ってます

質問者が選んだベストアンサー

関数 rand() の仕様は確認しましたか?
関数 rand() は「0 と RAND_MAX の間の値」を返します. この RAND_MAX は「少なくとも 32767」と決まっているだけなので, 実際の値は処理系に依存します. 従って, RAND_MAX が大きな処理系で計算すると pai_calc の中の if の条件はほとんど成り立たず, 従って m のインクリメントも起きないということが考えられます.
でどうするかというと先生のいわれる「マジックナンバー 32768.0 を使うな」で, これを (普通は) (RAND_MAX + 1.0) で置き換えます. #1 のように (float)RAND_MAX で置き換えてもいいんだけど, 前者だと 0以上 1未満, 後者だと 0以上 1以下の乱数になります.今の場合にはほとんど問題ないはずですが, おそらく前者の方が安全.
ちなみに pai じゃなくて pi ね.

投稿日時 - 2007-12-21 17:35:52

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

floatはdoubleに型をそろえた方がいいのでは

投稿日時 - 2007-12-22 09:46:54

ANo.2

pai_calc関数のmをint型に変えて、
pai=4*m/n;
の文を
pai=4.0*m/n;
に変えてみたら、どうなるでしょうか。

また、今のコードでは毎回同じ結果を得るので、
乱数を使うプログラムとしてはあまりおもしろくないような気がします。
main関数の先頭あたりで、乱数を初期化するための
srand関数を実行すると、毎回結果が変わっておもしろいかもしれません。

ちなみに、少数ではなくて小数です。

投稿日時 - 2007-12-21 17:01:26

ANo.1

32768.0を(float)RAND_MAXに置き換えてみては?
RAND_MAXはstdlib.hで定義されています。

投稿日時 - 2007-12-21 16:31:32

あなたにオススメの質問