蒙特卡洛算法
- 格式:pdf
- 大小:291.03 KB
- 文档页数:2
1. 蒙特卡洛⽅法的基本思想
蒙特卡罗⽅法⼜叫统计模拟⽅法,它使⽤随机数(或伪随机数)来解决计算的问题,是⼀类重要的数值计算⽅法。该⽅法的名字来源于世界著名的赌城蒙特卡罗,⽽蒙特卡罗⽅法正是以概率为基础的⽅法。
⼀个简单的例⼦可以解释蒙特卡罗⽅法,假设我们需要计算⼀个不规则图形的⾯积,那么图形的不规则程度和分析性计算(⽐如积分)的复杂程度是成正⽐的。⽽采⽤蒙特卡罗⽅法是怎么计算的呢?⾸先你把图形放到⼀个已知⾯积的⽅框内,然后假想你有⼀些⾖⼦,把⾖⼦均匀地朝这个⽅框内撒,散好后数这个图形之中有多少颗⾖⼦,再根据图形内外⾖⼦的⽐例来计算⾯积。当你的⾖⼦越⼩,撒的越多的时候,结果就越精确。
2.例⼦
蒙特卡洛算法显然可⽤于近似计算圆周率:让计算机每次随机⽣成两个0到1之间的数,看这两个实数是否在单位圆内。⽣成⼀系列随机点,统计单位圆内的点数与圆外的点数,内接圆⾯积和正⽅形⾯积之⽐为PI:4,PI为圆周率。,当随机点取得越多时,其结果越接近于圆周率。
下⾯给出c++版本的实现:
#include
#include
#include
#include
using namespace std;
double in,out,ans;
double x,y,dis;
double getrand()
{
double ran=0;
int t=rand()%10000;
ran=(double)t/10000;
return ran;
}
int main()
{
int time=0;
scanf("%d",&time);
for(int i=1;i<=time;i++)
{
x=getrand()*2;y=getrand()*2;
dis=sqrt((1-x)*(1-x)+(1-y)*(1-y));
if(dis>1) out++;
else in++;
}
ans=4*in/(in+out);
printf("%lf",ans);
return 0;
}
蒙特卡洛算法
如图,当time的值取1*10^9时,PI的值表⽰为3.040527,这个值和真实值仍有较⼤区别,主要原因在cstdlib库中的rand_max,即随机数值的最⼤范围仅为32767。