欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

蒙特卡洛方法(Monte Carlo Method)

程序员文章站 2022-07-05 23:00:55
...

蒙特卡洛方法(Monte Carlo Method)

特卡罗法(Monte Carlo method)是以概率与统计的理论、方法为基础的一种计算方法,蒙特卡罗法将所需求解的问题同某个概率模型联系在一起,在电子计算机上进行随机模拟,以获得问题的近似解。因此,蒙特卡罗法又称随机模拟法或统计试验法。二十世纪四十年代中期,由于科学技术的发展和电子计算机的发明,蒙特卡洛方法作为一种独立的方法被提出来,并首先在核武器的试验与研制中得到了应用。但基本思想并不新颖,人们在时间和科学试验中就已发现,并加以利用。

基本思想

当所求问题的解是某个事件的概率,或者某个随机变量的数学期望,或者是与概率、数学期望有关的量时,通过某种试验的方法,得出该事件发生的概率,或者该随机变量若干个具体观察值的算术平均值,通过它得到问题的解。这就是蒙特卡洛方法的基本思想。

现实问题中的蒙特卡洛方法的应用

估计圆周率PI,由大数定理知:在试验不变的条件下,重复试验多次,随机事件的频率近似于它的概率。偶然中包含着某种必然。我们知道正方形内接圆的面积与正方形面积之比正好为PI/4,假设向正方形区域撒芝麻,且每一粒芝麻出现在正方形内任意位置的概率是相等的,当向正方形内撒入的芝麻数量充分大时,落入正方形内接圆中的芝麻数量与所有落入正方形内芝麻数量之比近似等于正方形内接圆面积与正方形面积之比(亦即芝麻落入正方形内时,刚好落入正方形内接圆的概率),如图所示。蒙特卡洛方法(Monte Carlo Method)
代码如下:

/****************************************
* Monte Carlo Method for calculating PI 
*										
* By chyeer 2017/07/08					
*****************************************/

#include 
#include 

using namespace std;

#define MAX_ITER 1e8

double randBetweenLandR(double left, double right){
	return left + (right - left)*1.0*rand()/RAND_MAX;
}

double GetPi(){
	double x, y;
	int cnt = 0;
	for(size_t i=0; i
运行结果:
蒙特卡洛方法(Monte Carlo Method)