

(示意圖:考慮AB與XY這兩個間距)
/** * buffon.c - Simulating Buffon's Needle Problem * * Authored by Jim Huang <jserv.tw@gmail.com> * Public Domain. Runtime confirming to POSIX.1-2001. */ #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> int main( int argc, char **argv ) { int i; int ntrial = 99991; /* the largest prime number < 100000 */ int crossing = 0; srand48( time( NULL ) ); /* * ---------------------------------------- * || * || 1 * || / ) Theta ||x * -----------------/---------------------- * x <= 1/2 * sin( Theta ), when needles cross a crack. */ for (i = 0; i < ntrial; i++) { double theta = M_PI * drand48(); /* 0 <= Theta <= PI */ double x = drand48(); /* 0 <= x < 1 */ if (x <= 0.5 * sin(theta)) crossing++; } printf("Needles dropped on floor = %8d \n", ntrial); printf("Those that cross a crack = %8d \n", crossing); printf("\tPI Estimate: "); printf("%0.5f \n", (double)ntrial / (double)crossing); return 0; }我得到最接近的輸出為:
Needles dropped on floor = 99991
Those that cross a crack = 31830
PI Estimate: 3.14141
其中 99991 是五位數中最大的質數,在隨機試驗中沒有特別的意義。行文至此,彷彿聞到「π香水」給予人充沛與活力的美妙體驗,謎樣的數學,謎樣的π。谢谢你的介绍,以前知道这种求 pi 的方法,不过一直不知道为什么,现在明白了。
这个式子 m ≈ (2ln) / (πd) 里的 l 应该还是大写的吧。
有趣!將有趣的想法實做佩服!
不過有一個小地方不解
其中,針與平行線的銳角交角為θ,針的中點到最近一條直線的距離為 Y。我們可得之,若 Y ≦ l/2sinθ,則小針壓線,反之,若 Y > l/2sinθ,則小針不壓線。進一步來看,在上圖下方中,點 (θ, Y) 若落於矩形中的曲線下部分,針就壓線,反之就是不壓線,因此,針壓線的機率就是曲線下部分在長方形中所占的比例。經過分析後,我們就可著手以機率統計理論來探討。
Y ≦ l/2sinθ , Y > l/2sinθ 這邊這兩個式子有點百思不解
是否是 等號右邊少了個 d
Y ≦ d*1/2sinθ
,and
Y > d*l/2sinθ
或者您假設在這邊 d = 1 ?
PS: 希望會來還可以看到更多對自然的觀察與瞭解後自己實做的例子!
由 suglwu 發表於 April 4, 2008 07:12 PM有個疑惑 ...
接著考慮到 L = πk 的特例。 這邊既然已經說使用 L = πk(d??) 這個特例了,那以後的推導都是建立在這個前提下。因此,
π ≈ (2Ln) / (dm) , 也應該是在剛剛那個前提下所推導出來的結果,但是後來卻直接用 L = d/2 去產生π ≈ n / m這個式子,有點奇怪。推導過程中程中,有哪一個步驟消去 L = πk(d??)這個前提假設嗎?? L = d/2 和條件的 L = πk(d??) 應該是不等吧?? 是我漏看哪邊了嗎??
@GeorgeKang, @gohiei, @suglwu, @Chen Yufei,
感謝指教,原本的寫法在觀念上容易令人混淆,已經改寫該段落,只以簡單的比例作表示。
由 jserv 發表於 April 6, 2008 07:19 PM呵呵,與數學有關的小品文章真是有意思啊!其實,現在很多物理模擬的軟體,依舊是採用Monte Carlo方法呢!
由 YChao 發表於 April 8, 2008 05:08 AM百度上延伸討論,可參考: http://zhidao.baidu.com/question/55780192.html
由 jserv 發表於 July 16, 2008 12:20 AM