プロが教える店舗&オフィスのセキュリティ対策術

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define MAX 1000

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);
}

この方法で円の面積を求めたんですが、もう少し精度を上げたいと思います。ただそのプログラムをどうやって書けばいいのかさえわからずとまどっています。円全体でなくその一部を考え、またその部分を簡単に面積が求められるようにわけるプログラムを組みたいのですがどのようにすればいいのか教えてください。

A 回答 (4件)

No.2のプログラムは、半径1の円の1/4を求めて4倍しています(半径1の円の面積を計算している)から、半径0.5の円の面積を求めたければ1/4倍しないといけませんね。

(半径1の円の面積はπ、半径0.5の円の面積は0.25π)
精度をあげるには繰り返し回数を増やすのが簡単ですかね。ただし回数を増やすとsumの数値が大きくなって精度落ちますので一定回数で区切って計算したほうがいいです。

質問の「円全体でなくその一部を考え、またその部分を簡単に面積が求められるようにわける」というのはよく意味が分かりませんでした。

この回答への補足

円全体を考えるのではなく、ある一部を考えて、またその一部においても、簡単に面積が求められる部分にわける。って感じなんですけど。。なんかうまく伝えれなくてすいません。。とりあえず円を分割したら精度があがるのかなと。。そのプログラムが知りたいんですけど。。わかりにくい質問に答えていただいてありがとうございました!

補足日時:2004/11/01 09:16
    • good
    • 0

> なぜか円周率が求まってしまいます。



半径1の円の面積はπですが。
    • good
    • 0
この回答へのお礼

…。

ありがとうございました(笑。

お礼日時:2004/11/01 16:32

>円全体でなくその一部を考え・・・


円の第一象限だけ計算することができます。
半径1の円の右上の部分です。
乱数の発生の部分はそのまま中心(0,0)から距離が1未満の場合円の中にあるとカウントして最後に4倍すれば結果が出ます。

この回答への補足

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define MAX 1000

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*x1+x2*x2<1.0)
{
sum++;
}
}
s=(sum/MAX)*4;
printf("円の面積:%15.6e\n",s);
}


としたのですが、なぜか円周率が求まってしまいます。。どこか間違っていますか?どう書き換えればいいのか教えてください。

補足日時:2004/10/31 10:40
    • good
    • 0
この回答へのお礼

すいませんがどのように扇形を求めるプログラムを書けばいいのか教えてもらえないでしょうか。。わからないんです。。

えとつまりその式を4倍したらいいんですよね。

お礼日時:2004/11/01 20:02

乱数の質がよければ、MAXを大きくするだけでいくらでも精度が上がると思います。

    • good
    • 0
この回答へのお礼

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

お礼日時:2004/10/31 10:16

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