yakusouX5の日記: Buffonの針 4
日記 by
yakusouX5
計算機化学とやらの宿題でBuffonの針でπを求めろと来たのだが、どうにもそれらしい答えにならない
πが4付近に収束するのです。なぜなのかさっぱり
あと、πの値を求めたいのにπを使って証明しているのですがそれっていいのか?なんとなく気持が悪い
この問題ってπの値を求めるのでは無いような気がしてきた
#include<iostream>
#include<stdlib.h>
#include<time.h>
#include<math.h>
using namespace std;
int main(){
int i, j=0, count=0;
double tyuuten,harisaki;
srand((unsigned int)time(0));
for (i=1; i<=7; i++){
for (j=j; j < (int)pow(10.0,(double)i); j++) {
// 0<= 中点 <=1
tyuuten = (double)rand() / RAND_MAX;
//中点-0.5 <= 針先の回転 <= 中点+0.5
harisaki = (double)rand() / RAND_MAX - 0.5 + tyuuten ;
//平行線 0と1にかかったか
if ( ( tyuuten < 0.5 && (harisaki < 0.0 || harisaki > 2.0*tyuuten) )
|| ( tyuuten > 0.5 && (harisaki > 1.0 || harisaki < 2.0*tyuuten-1.0) ) ) {
count++;
}
}
cout << j << "回目 " << 2.0*j /count << endl;
}
return 0;
}
πが4付近に収束するのです。なぜなのかさっぱり
あと、πの値を求めたいのにπを使って証明しているのですがそれっていいのか?なんとなく気持が悪い
この問題ってπの値を求めるのでは無いような気がしてきた
#include<iostream>
#include<stdlib.h>
#include<time.h>
#include<math.h>
using namespace std;
int main(){
int i, j=0, count=0;
double tyuuten,harisaki;
srand((unsigned int)time(0));
for (i=1; i<=7; i++){
for (j=j; j < (int)pow(10.0,(double)i); j++) {
// 0<= 中点 <=1
tyuuten = (double)rand() / RAND_MAX;
//中点-0.5 <= 針先の回転 <= 中点+0.5
harisaki = (double)rand() / RAND_MAX - 0.5 + tyuuten ;
//平行線 0と1にかかったか
if ( ( tyuuten < 0.5 && (harisaki < 0.0 || harisaki > 2.0*tyuuten) )
|| ( tyuuten > 0.5 && (harisaki > 1.0 || harisaki < 2.0*tyuuten-1.0) ) ) {
count++;
}
}
cout << j << "回目 " << 2.0*j /count << endl;
}
return 0;
}
そりゃ出ませんよ (スコア:1)
まずは以下のように直してみてください
harisaki=sin((double)rand()/RAND_MAX*M_PI/2)*0.5+tyuuten;針先の角度(Θ)が一様分布するのであって、針先と中点のある軸方向に対する距離(0.5sin Θ)が一様分布するわけじゃあないわけですんで。
残念ながら昨日提出しました (スコア:1)
更に、ここには書いていませんが課題の条件で角度やπを使うことは禁止となっているので、そこで困ってしまいました
うすっぺらいコメントがあらわれた! ▼
Re:残念ながら昨日提出しました (スコア:1)
気がつくのが遅くてごめんなさい。m(__)m それとなかなか厳しい条件ですね。(Buffon の針なら、角度が一様分布するのが本質的な条件になるので) 難しそうなので、しばらく考えさせてください。
別の方法で乱数からpiを近似する方法ならご紹介できます:
Re:残念ながら昨日提出しました (スコア:1)
夏休み明けを一週間間違えて初回の講義が休講になったり。しかも旅行に行っていたとか
別の方法の乱数からπを求める方法は前回の課題で既に…
うすっぺらいコメントがあらわれた! ▼