计算pi(蒙特卡罗方法)

by Yan Sheng

描述:

用该方法计算π(pi)的基本思路是:根据圆面积的公式: s=πR^2 ,当R=1时,S=π。

由于圆的方程是:x^2+y^2=1,因此1/4圆面积为x轴、y轴和上述方程所包围的部分。 如果在1*1的正方形中均匀地落入随机点,则落入1/4圆中的点的概率就是1/4圆的面积。其4倍,就是圆面积。由于半径为1,该面积的值为π的值。

代码:

C实现

//使用Monte Carlo计算pi值
#include <iostream.h>
#include <time.h>
#include <iomanip.h>

const long N=2000000000;  //定义随机点数

int main()
{
    int n = 0;      //统计落入1/4单位圆内的点数
    double x, y;  //坐标

    srand(time(00));

    for (int i = 1; i <= N; i++)
    {
        x = (double)rand()/RAND_MAX; //随机产生x,y坐标,在0~1之间
        y = (double)rand()/RAND_MAX;

        if (x*x + y*y <= 1.0) n++;
    }

    cout<<"The PI is "<<setprecision(15)<<4*(double)n/N<<endl;
    return 1;
}

测试结果

$ time ./pi
The PI is 3.141627052

real    3m58.385s
user    3m36.050s
sys    0m1.584s

实验结果和实际相差很大的话,可以通过扩大随机测试值来获得更精确的结果。

注:实验中可以应用“iomanip.h”中的setprecision(int);来设置输出精度。

java实现

public class CalculatePI
{
   public static final int N = 2000000000;
   public static void main(String[] args)
   {
      double x, y;
      int n = 0;
      for (int i = 0; i < N; i++)
      {
         x = Math.random();
         y = Math.random();

         if (x * x + y * y <= 1)
            n++;
      }
      System.out.println("The PI is " + 4*(double)n/N);
   }
}
Datamining