題目:
蒙塔卡羅(Monte Carlo)方法苫费,又稱隨機(jī)抽樣或統(tǒng)計(jì)試驗(yàn)方法。當(dāng)所要求解的問題是某種事件出現(xiàn)的概率,或某隨機(jī)變量的期望值時荐开,可以通過某種“試驗(yàn)”的方法求解。
蒙塔卡羅法.jpg
應(yīng)用蒙瑞特卡羅方法求解π的步驟:隨即向單位正方形和圓結(jié)構(gòu)拋灑大量點(diǎn)简肴,判斷每個點(diǎn)在圓內(nèi)或者圓外晃听,圓內(nèi)點(diǎn)數(shù)除以圓外點(diǎn)數(shù)就是π值。隨機(jī)點(diǎn)數(shù)量越大砰识,得到的π值越精確能扒。
實(shí)際問題:
對于隨機(jī)數(shù)的處理要小心再小心,稍有不小心就會改變數(shù)字的頻率辫狼,導(dǎo)致最終結(jié)果誤差太大初斑。
剛開始使用模10乘0.1的方法:
class="brush:cpp;toolbar:false">x/y=rand()%10*0.1;
修正過的語句,比之前的算出的pi精確了不少
x/y=rand()*1.0/RAND_MAX;
源碼:
//PI計(jì)算
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <ctime>
using namespace std;
int main()
{
cout<<"***COUNT PI***\n Try 100,000,000 times\n"<<endl;
cout<<"counting....."<<endl;
doublex,y,z,num=0,a=1;//定義坐標(biāo)參數(shù)
const int max_num=100000000;//嘗試次數(shù)
srand(unsigned(time(0)));//用時間做隨機(jī)數(shù)的種子
for (int i = 0; i<max_num; i++)//生成隨機(jī)數(shù)
{
x=rand()*1.0/RAND_MAX;
y=rand()*1.0/RAND_MAX;
z=x*x+y*y;
//cout<<z<<"\t";
if(z<=a)//判斷是否落在圓內(nèi)
num++;
}
cout<<"PI="<<(num/max_num)*4<<endl;
return0;
}