蒙特卡洛算法(Monte Carlo algorithm)求圆周率

蒙特卡洛算法是统计模拟算法的一种,蒙特卡洛算法的数学理论基础是大数定理,在事件发生次数多的情况下,利用事件发生的频率作为时间发生概率的近似值

统计问题可直接求解,对于连续问题可不用离散化

与穷举法相对比而言,属于随机搜索,而穷举法属于给定特定规则的搜索

下面给出一个实例,来让蒙特卡洛算法求出圆周率

蒙特卡洛算法(Monte Carlo algorithm)求圆周率_第1张图片

在一个2*2的矩形内,随机生成点,求在圆中相对矩形的数量比例,从而推出圆周率

推导过程:

矩形面积:圆的面积 = 所有点的数量:落在圆中点的数量

=> 4r*r :Pi*r*r = 所有点的数量:落在圆中点的数量

=> Pi = 4*落在圆中点的数量/所有点的数量

#include 
#include 
#include 
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(rand()) / RAND_MAX;
		double y = static_cast(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数,从而有更精确的求解

你可能感兴趣的:(概率论,c++)