几率算法依照几率统计的思路来求解问题,每每不能获得问题的精确解,但却在数值计算物生获得了普遍的应用。由于不少数学问题,每每没有或者很难计算解析解,这时便须要经过数值计算来求解近似值。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)算法。
蒙特卡罗算法的一个典型应用:计算圆周率π。
使用蒙特卡罗计算圆周率有以下两个关键点:
均匀撒点->用随机函数实现;
区域 判断->经过计算判断:
公式以下:
#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的精确度不一样,结果也是不一样的;