• 締切済み

この円を分割して。。

#include <stdio.h> #include <time.h> #include <stdlib.h> #define MAX 10000 void main(void) { int i; float x1, x2, en, sum=0.0, s; srand( (unsigned)time( NULL ) ); for(i=0;i<MAX;i++) { x1=((float)rand()/(float)RAND_MAX); x2=((float)rand()/(float)RAND_MAX); if(en=(x1-0.5)*(x1-0.5)+(x2-0.5)*(x2-0.5)<=(0.5)*(0.5)) { sum++; } } s=sum/MAX; printf("円の面積:%15.6e\n",s); } 円の面積を求める方法です。がもう少し精度をあげる工夫をしようと思うのですが、円を4分割した第一象限の部分に乱数をとばしその面積を求め、4倍することで求めたいのですがどうプログラムを変えたらいいか教えてください。

みんなの回答

回答No.4

質問にはモンテカルロ法とは書いてないですが、やっぱりモンテカルロ法が前提なんでしょうね。 精度向上させるには、乱数の質(一様性)をあげる、繰り返し回数を増やすぐらいでしょうか。。。floatをdoubleにすると環境によっては効き目があるかもしれません。 ちょっと疑問なのが、精度を評価する基準はどう考えているのだろう?ということです。何回か繰り返して標準偏差とか計算するのでしょうか??

回答No.3

モンテカルロ法で精度を上げるには、質のよい乱数生成を行わないとダメじゃないかと。メルセンヌ・ツイスターとか。

参考URL:
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html
回答No.2

> …がもう少し精度をあげる工夫をしようと思うのですが、円を4分割した第一象限の部分に乱数をとばしその面積を求め、4倍することで求めたいのですが… そうすると何故、精度が上がるんですか?

tyuukichi
質問者

補足

そうですね。。よく考えたらあがらないですね。。 う~ん、、どうしたらいいんだろう。。

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

前の質問はよかったんでしょうか? それはともかく, 「円の面積を求める」と言われても, どんな円なのか (半径はいくつ?) がわからないとどうしようもありません. 「半径 1の円の面積を, その第1象限の面積から求める Monte Carlo アルゴリズム」なら前の質問で既に出ているので, それとは違うんですよね.