標籤:style http 使用 os strong io for 2014
[摘錄自百度百科]蒙特·卡羅方法(Monte Carlo method),也稱統計類比方法,是二十世紀四十年代中期由於科學技術的發展和電子電腦的發明,而被提出的一種以機率統計理論為指導的一類非常重要的數值計算方法。是指使用隨機數(或更常見的偽隨機數)來解決很多計算問題的方法。與它對應的是確定性演算法。蒙特·卡羅方法在金融工程學,宏觀經濟學,計算物理學(如粒子輸運計算、量子熱力學計算、空氣動力學計算)等領域應用廣泛。上章研究了Property List詳解需要瞭解的可以看看。
下面介紹使用蒙特·卡羅方法求解圓周率PI的方法。
演算法模型:假設有一個1單位邊長的正方形,我們再以該正方形的一個頂點為圓點,以1單位為半徑做一個1/4圓弧,。根據圓形面積公式可是:s=πr^2=π。而1/4的圓弧則為s/4=π/4。而正方形面積為1。我們假設這樣一個情景:限定有一些隨機的點落在該正方形內,點的個數為n,而落在圓弧內的點為m(如何判斷一個點在圓內還是圓弧外呢?因為圓弧上的點距離圓心正好是半徑1,所以距離圓心小於1的就在圓內,比中的藍色點,而紅色點在圓外),則如果點數足夠多的話,會於正方形和圓弧的面積有關,即有:1/4圓弧面積除以正方形面積=π/4=m/n.則有:π=4*m/n。如果用電腦類比大量的隨機數,則會計算出比較精確的π。下面是蒙特·卡羅方法求π的C語言實現。
| 123456789101112131415161718192021222324252627282930 |
#include < iostream > #include < cmath > #include < ctime > #define COUNT 500000 // 迴圈取樣次數 using namespace std; // 判斷點是否在1/4圓範圍之內 bool InCircle(double x,double y) { if((x *x +y * y)<= 1) return true ; return false ; } void main() { double x,y; int num= 0; int i; srand((unsigned)time(NULL)); for(i= 0;i< COUNT;i++ ) { x= rand()* 1.0/ RAND_MAX;//產生0-1之間的隨機數 y= rand()* 1.0/ RAND_MAX; if(InCircle(x,y)) num++ ; } cout<< " PI: "<< (num *4.0 )/ COUNT<< endl; } |