- 締切済み
この円を分割して。。
#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倍することで求めたいのですがどうプログラムを変えたらいいか教えてください。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- JaritenCat
- ベストアンサー率37% (122/322)
質問にはモンテカルロ法とは書いてないですが、やっぱりモンテカルロ法が前提なんでしょうね。 精度向上させるには、乱数の質(一様性)をあげる、繰り返し回数を増やすぐらいでしょうか。。。floatをdoubleにすると環境によっては効き目があるかもしれません。 ちょっと疑問なのが、精度を評価する基準はどう考えているのだろう?ということです。何回か繰り返して標準偏差とか計算するのでしょうか??
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
モンテカルロ法で精度を上げるには、質のよい乱数生成を行わないとダメじゃないかと。メルセンヌ・ツイスターとか。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> …がもう少し精度をあげる工夫をしようと思うのですが、円を4分割した第一象限の部分に乱数をとばしその面積を求め、4倍することで求めたいのですが… そうすると何故、精度が上がるんですか?
- Tacosan
- ベストアンサー率23% (3656/15482)
前の質問はよかったんでしょうか? それはともかく, 「円の面積を求める」と言われても, どんな円なのか (半径はいくつ?) がわからないとどうしようもありません. 「半径 1の円の面積を, その第1象限の面積から求める Monte Carlo アルゴリズム」なら前の質問で既に出ているので, それとは違うんですよね.
補足
そうですね。。よく考えたらあがらないですね。。 う~ん、、どうしたらいいんだろう。。