讀了阮一峰的蒙特卡羅方法入門,用概率統(tǒng)計的方式求解棘手的數(shù)學問題還挺有意思的,尤其是利用正方形和它的內(nèi)切圓之間的面積關系來建模求解圓周率的方法精巧又簡單,比投針實驗好理解也好實現(xiàn)多了。建??刹皇荕atlab或者MAST/VHDL語言的專利,既然tcl/tk語言也有內(nèi)置的隨機數(shù)產(chǎn)成函數(shù)rand(),那么我用tcl/tk建模計算圓周率也應該不在話下。

建模思想

正方形的內(nèi)切圓與該正方形的面積之比是π/4。 
seo優(yōu)化培訓,網(wǎng)絡推廣培訓,網(wǎng)絡營銷培訓,SEM培訓,網(wǎng)絡優(yōu)化,在線營銷培訓 
seo優(yōu)化培訓,網(wǎng)絡推廣培訓,網(wǎng)絡營銷培訓,SEM培訓,網(wǎng)絡優(yōu)化,在線營銷培訓 
圖片和公式引用自阮一峰的蒙特卡羅方法入門

在這個正方形內(nèi)部,隨機產(chǎn)生足夠多的點,計算它們與中心點的距離,判斷是否落在圓的內(nèi)部。如果這些點均勻分布,那么圓內(nèi)的點應該占到所有點的 π/4,因此將這個比值乘以4,就是π的值。

腳本實現(xiàn)

tcl/tk內(nèi)置math函數(shù)庫的rand()方法可以隨機生成0~1的浮點數(shù),假設圓的半徑為整數(shù)r,可以用以下方式產(chǎn)生(0,r)區(qū)間的隨機整數(shù):

  1. set value [int[expr rand()* $r]]

為了計算簡便,可以把模型進一步簡化,只計算第一象限內(nèi)的點落入圓內(nèi)的比例。為了觀察tcl/tk的*rand()*函數(shù)是否真的隨機,我又多加了幾行tk代碼,把所有的點都顯示出來。下面的代碼中正方形的邊長為300,隨機產(chǎn)生300*300個點,理想情況下如果隨機點100%均勻分布,那么