ページ 11

円周率が出ない。。。

Posted: 2010年7月26日(月) 13:49
by 山本
#include <stdio.h>
#include <stdlib.h>

int main()
{
double pi;
printf("pi=%f\n",pi);
}

double calc_pi()
{double x,y,i,pi;
int count;
for(i=0;i<=1000;i++){
x=(double)rand() / (RAND_MAX + 1);
y=(double)rand() / (RAND_MAX + 1);
if((x*x+y*y)<1.0)
{count+=1.0;}
}
pi=count/1000*4.0;
return (int)pi;
}

これで円周率が出てくれないのはなぜ??

Re:円周率が出ない。。。

Posted: 2010年7月26日(月) 14:24
by fatens
>これで円周率が出てくれないのはなぜ??

・calc_pi 関数を呼びだしていない
・calc_pi 関数のプロトタイプ宣言がない
・countを0で初期化していない
・pi=count/1000*4.0 count/1000はint型同士の割り算なので結果もint型になってしまう
・return (int)pi int型にキャストしたのでは、小数点以下の値が帰らない

など

Re:円周率が出ない。。。

Posted: 2010年7月26日(月) 19:50
by 初級者
プログラムは、思ったとおりには動きません。
書いたとおりに動きます。

Re:円周率が出ない。。。

Posted: 2010年7月26日(月) 22:49
by パコネコ
実際にうごいてるのは
/*
double pi;
printf("pi=%f\n",pi);
*/
これだけ…

>int count;
int(整数)でいいんですか?
どちらかというと「i」のほうが整数っぽい

Re:円周率が出ない。。。

Posted: 2010年7月26日(月) 23:00
by 初級者
円の内側にある点の「個数」を数えるための変数ですから、
「当然」整数です。

Re:円周率が出ない。。。

Posted: 2010年7月26日(月) 23:45
by パコネコ
そうですか…
計算が楽になるかな~と思ったのですが…
それに1.0ずつ足していたので整数型ではないと考えたんですが、
ダメみたいですね。すいませんでした。

Re:円周率が出ない。。。

Posted: 2010年7月27日(火) 07:28
by たいちう
> それに1.0ずつ足していたので整数型ではないと考えたんですが、
> ダメみたいですね。すいませんでした。

違和感を感じる着眼点は正しいですが、結論が逆でしたね。

1.0ずつ足しているのに整数型、ではなく、
整数型なのに1.0ずつ足している、です。

Re:円周率が出ない。。。

Posted: 2010年7月27日(火) 16:21
by QERA
#include <stdio.h>
#include <stdlib.h>

double calc_pi(void);

int main()
{
double pi;
pi = calc_pi();
printf("pi=%lf\n",pi);
}

double calc_pi()
{double x,y,pi,count=0;
int i;
for(i=0;i<=1000;i++){
x=(double)rand() / (RAND_MAX + 1);
y=(double)rand() / (RAND_MAX + 1);
if((x*x+y*y)<1.0)
{count+=1.0;}
}
pi=count/1000*4.0;
return pi;
}

こうですかね? 画像

Re:円周率が出ない。。。

Posted: 2010年7月27日(火) 16:47
by 初級者
1001回の試行で得られたcountの値を1000で割っているため、
やや厳密性に欠けるでしょう。
まあ、モンテカルロ法自体がそうなんですけどね。

Re:円周率が出ない。。。

Posted: 2010年7月27日(火) 17:11
by フリオ
 
ごめんなさい。勘違いです。
countはdoubleですね。
 
画像