蒙特卡洛算法是统计模拟算法的一种,蒙特卡洛算法的数学理论基础是大数定理,在事件发生次数多的情况下,利用事件发生的频率作为时间发生概率的近似值
统计问题可直接求解,对于连续问题可不用离散化
与穷举法相对比而言,属于随机搜索,而穷举法属于给定特定规则的搜索
下面给出一个实例,来让蒙特卡洛算法求出圆周率
在一个2*2的矩形内,随机生成点,求在圆中相对矩形的数量比例,从而推出圆周率
推导过程:
矩形面积:圆的面积 = 所有点的数量:落在圆中点的数量
=> 4r*r :Pi*r*r = 所有点的数量:落在圆中点的数量
=> Pi = 4*落在圆中点的数量/所有点的数量
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
#define Step 100000000 //模拟实验的次数
int main()
{
srand((unsigned)time(NULL));
int inside = 0;
for(int i = 0; i < Step; ++i) {
double x = static_cast<double>(rand()) / RAND_MAX;
double y = static_cast<double>(rand()) / RAND_MAX;
if(x * x + y * y <= 1.0)
{
++inside; //如果点在圆内则,让inside记录下来
}
}
double pi = 4.0 * inside / Step;
cout << "PI = " << pi << endl;
return 0;
}
求了几次发现只有小数点后前几位精确,若想提高精度,可增大step数,从而有更精确的求解