题目:
蒙塔卡罗(Monte Carlo)方法,又称随机抽样或统计试验方法。当所要求解的问题是某种事件出现的概率,或某随机变量的期望值时,可以通过某种“试验”的方法求解。
蒙塔卡罗法.jpg应用蒙瑞特卡罗方法求解π的步骤:随即向单位正方形和圆结构抛洒大量点,判断每个点在圆内或者圆外,圆内点数除以圆外点数就是π值。随机点数量越大,得到的π值越精确。
实际问题:
对于随机数的处理要小心再小心,稍有不小心就会改变数字的频率,导致最终结果误差太大。
刚开始使用模10乘0.1的方法:
class="brush:cpp;toolbar:false">x/y=rand()%10*0.1;
修正过的语句,比之前的算出的pi精确了不少
x/y=rand()*1.0/RAND_MAX;
源码:
//PI计算
#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;//定义坐标参数
const int max_num=100000000;//尝试次数
srand(unsigned(time(0)));//用时间做随机数的种子
for (int i = 0; i<max_num; i++)//生成随机数
{
x=rand()*1.0/RAND_MAX;
y=rand()*1.0/RAND_MAX;
z=x*x+y*y;
//cout<<z<<"\t";
if(z<=a)//判断是否落在圆内
num++;
}
cout<<"PI="<<(num/max_num)*4<<endl;
return0;
}
网友评论