Monte Carlo (蒙特卡罗) 计算圆周率Pi

蒙特卡罗算法计算圆周率的主导思想是:统计学(概率)

原理:
先画一个正方形,画出其内切圆,然后这个正方形内随机的画点,设点落在圆内的概为P,则P=圆面积/正方形面积。
P=Pi*R*R/ 2R*2R=Pi/4         即 Pi=4P
—————————
实验步骤:
1. 在一个平面直角坐标系下(暂定第一象限),在点(R , R)(R>0)处画一个半径为R的圆。

2. 以这个圆画一个外接正方形,其边长为2R。

3. 随机取一点(X,Y)使得0<=X<=2R并且0<=Y<=2R,即随机点在正方形内。

4. 判断点是否在圆内,通过公式(R-X)(R-X)+(R-Y)(R-Y)<R*R计算。

5. 设所有点(也就是实验次数)的个数为N,落在圆内的点(满足步骤4的点)的个数为M,则
    P=M/N           于是Pi=4*N/M
————————
简化步骤:
1.将圆心设在原点,以R为半径做圆,则第一象限的1/4圆面积为Pi*R*R/4

2.做该1/4圆的外接正方形, 坐标为(0,0)(0,R)(R,0)(R,R),则该正方形面积为R*R

3.随即取点(X,Y),使得0<=X<=R并且0<=Y<=R,即点在正方形内

4.通过公式 X*X+Y*Y<R*R判断点是否在1/4圆周内。

5.设所有点(也就是实验次数)的个数为N,落在1/4圆内的点(满足步骤4的点)的个数为M,则
    P=M/N           于是Pi=4*N/M
————————
伪代码:
calculate(N)              //设置迭代次数,即实验样本数,即点的总个数,即N
{
       counter=N ;   
       M=0;                   //统计落在1/4圆周内的点的个数
       radius=1;             //设半径为1
       while(counter-- >0)
       {   
              x=rand();                  //返回0到1间的随机数
              y=rand();
              if(x*x+y*y<=1)        //检验点是否落在1/4圆内
                       M++;
       }
       return M/N;
}
___________________________________________________________________
根据概率论的原理,当实验次数越多(N越大),所计算出的Pi也越准确。

但计算机上的随机数毕竟是伪随机数,当取值超过一定值,也会出现不随机现象,因为伪随机数是周期函数。因此为了提高准确度,可以固定一个较大的N值(使之小于伪随机函数的周期即可),进行多次计算Pi值(每次采用不同的随机数种子),然后对其求平均数的方法即可。

你可能感兴趣的:(算法)