算法中的几率算法基本思想

几率算法依照几率统计的思路来求解问题,每每不能获得问题的精确解,但却在数值计算物生获得了普遍的应用。由于不少数学问题,每每没有或者很难计算解析解,这时便须要经过数值计算来求解近似值。ios

几率算法基本思想算法

几率算法执行的基本过程以下:ide

(1)将问题转化为相应的几何图形s, S的面积是容易计算的,问题的结果每每对应几何图形中某一部分S1的面积。函数

(2)而后,向几何图形中随机撒点。spa

(3)统计几何图形S和S1中的点数。根据S的面积和S1面积的关系以及各图形中的点数来计算获得结果。3d

(4)判断上述结果是否在须要的精度以内,若是未达到精度则执行步骤 (2)。若是达到精度,则输出近似结果。code

几率算法大体分为以下4种形式。blog

数值几率算法。ci

蒙特卡罗(Monte Carlo)算法。数学

拉斯维加斯(Las Vegas) 算法。

舍伍德(Sherwood)算法。

蒙特卡罗算法的一个典型应用:计算圆周率π。

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

使用蒙特卡罗计算圆周率有以下两个关键点:

均匀撒点->用随机函数实现;

区域 判断->经过计算判断:

17fde28caaab16a4aa0e03d313213fd0.jpg

公式以下:

517619553a0c6aad701e23429f13f71e.jpg

#include<iostream>
#include<cstdlib>
#include<cmath>
using namespace std;
double MontePI(int n);
int main()
{
	int n;
	cout << "蒙特卡罗算法计算π" << endl;
	cout << "请输入n的值(撒点次数(迭代次数)):" << endl;
	cin >> n;
	cout << "PI=" << MontePI(n) << endl;
	return 0;
}
double MontePI(int n)
{
	double x, y;
	int i, sum = 0;
	srand(time(NULL));
	for (i = 1; i < n; i++)
	{
		x = (double)rand() / RAND_MAX;//产生0~1之间的一个随机数
		y = (double)rand() / RAND_MAX;
		if (pow(x, 2) + pow(y, 2) <= 1)
		{
			sum++;
		}
	}
	return (4.0 * sum / n);//计算π
}

 

随着迭代次数不一样,结果也不一样;

下次别人问你PI等于多少的时候,你千万不要说是3.14,或者3.1415926了,你应该说PI的精确度不一样,结果也是不一样的;

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

相关文章
相关标签/搜索