蒙特卡洛算法

  • 格式: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。