• ベストアンサー

動いているのに…

学校の課題で、 ランダム関数を使って、 πの近似値を求めようという課題が出されました。 そして、私は、 #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を使うな といわれましたが、これを他の方法で置き換えることが できません。 初心者で、まことに申し訳ございませんが、 ご教授ください。

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

関数 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 ね.

その他の回答 (3)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.4

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

  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.2

pai_calc関数のmをint型に変えて、 pai=4*m/n; の文を pai=4.0*m/n; に変えてみたら、どうなるでしょうか。 また、今のコードでは毎回同じ結果を得るので、 乱数を使うプログラムとしてはあまりおもしろくないような気がします。 main関数の先頭あたりで、乱数を初期化するための srand関数を実行すると、毎回結果が変わっておもしろいかもしれません。 ちなみに、少数ではなくて小数です。

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

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

関連するQ&A