蒙地卡罗法求 PI
问题:
蒙地卡罗为摩洛哥王国之首都,该国位于法国与义大利国境,以赌博闻名。蒙地卡罗的基本原理为以乱数配合面积公式来进行解题,这种以机率来解题的方式带有赌博的意味,虽然在精确度上有所疑虑,但其解题的思考方向却是个值得学习的方式。
算法说明:
蒙地卡罗的解法适用于与面积有关的题目,例如求PI值或椭圆面积,这边介绍如何求PI值;假设有一个圆半径为1,所以四分之一圆面积就为PI,而包括此四分之一圆的正方形面积就为1,如下图所示:
其中c为落在圆中的次数,n为落在正方形中的次数
代码如下:
/* 问题: 蒙地卡罗法求 PI 蒙地卡罗为摩洛哥王国之首都,该国位于法国与义大利国境,以赌博闻名。蒙地卡罗的 基本原理为以乱数配合面积公式来进行解题,这种以机率来解题的方式带有赌博的意味,虽然 在精确度上有所疑虑,但其解题的思考方向却是个值得学习的方式。 2013/7/18 张威 */ #include <iostream> #include <time.h> using namespace std; int main() { int n = 50000000;//n用来代表投射的次数,也就是精度 int c = 0;//落在圆上面的次数 clock_t start,end;//用于计时 start = clock() ; srand(time(NULL)); double x,y; for (int i = 1;i <= n;i++) { x = (double)(rand()/RAND_MAX); y = (double)(rand()/RAND_MAX); if ((x*x+y*y) < 1.0) { c++; } } cout<<"PI的值为: "<<(double)4*c/n<<endl; end = clock(); cout<<"总共花费了"<<(long double)(end - start)/CLK_TCK<<"秒"<<endl; return 0; }
运行结果如下:
虽然不是很准确,而且带有随机性,但是也不失为一个比较好的解题方式,尤其是在求解面积方面.