蒙特卡洛法求Pi
阿新 • • 發佈:2019-01-26
程式設計實現如下模擬:
飛鏢被隨機地投擲到以(1,1)和(-1,-1)為對角的正方形內。若飛鏢落在單位圓內【即以(0,0)為圓心,1為半徑的圓】,算命中。否則未命中。
執行這個模擬並用它求PI的近似值。
模型如下圖所示:
// Circle_PI.cpp : 定義控制檯應用程式的入口點。 // #include <iostream> #include <cstdlib> #include <ctime> #include <iomanip> using namespace std; const int MAX_DAST=100000; //投擲總數 double rand_double(double a,double b); void rand_seed(); //設定隨機數的種子 int main(void) { int PI_DAST=0; //投擲在圓裡面的總數 rand_seed(); for(int i=0;i<MAX_DAST;i++) { double x=rand_double(-1,1); double y=rand_double(-1,1); if( x*x+y*y<=1) PI_DAST++; } double PI=PI_DAST*4.0/MAX_DAST; cout<<fixed; cout<<"PI="<<PI<<endl; system("pause"); return 0; } /** 生成某一區域內的隨機浮點數 @param a 該區域的下邊界 @param b 該區域的上邊界 @param return 隨機浮點數x,x∈[a,b] */ double rand_double(double a,double b) { return a+(b-a)*rand()*1.0/RAND_MAX; /* RAND_MAX是VC中stdlib.h中巨集定義的一個字元常量: #define RAND_MAX 0x7FFF 其值最小為32767,最大為2147483647 通常在產生隨機小數時可以使用RAND_MAX。 */ } /** 設定隨機數生成器的種子 */ void rand_seed() { int seed=static_cast<int>(time(0)); //返回的是系統的時間 srand(seed); /* rand()產生偽隨機數。srand函式提供種子,種子不同產生的隨機數序列也不同,所以通常先呼叫srand函式,將time(0)的結果設定成種子。 srand函式是隨機數發生器的初始化函式。 */ }