用概率算法求pi值

来源:互联网 发布:免费室内设计软件 编辑:程序博客网 时间:2024/05/18 02:42

基本思想:以坐标原点为圆心作一个半径为1的单位圆,再作一个正方形与此圆相切(其实是否相切不重要,此处只是为了计算方便)。在这个正方形内任取n个点,并比较判断是否落在圆内,将落在圆内的点计作k,那么n与k的比值就可以看成正方形和圆的面积之比。即圆周率PI=4*k/n。
 源码如下:

 

 
#include "stdafx.h"
#include "stdio.h"
#include "time.h"
 
const unsigned long maxshort = 65536L;
const unsigned long multiplier = 1194211693L;
const unsigned long adder = 12345L;
 
class RandomNumber
{
private:
       unsigned long randSeed;
public:
       RandomNumber(unsigned long s = 0);
       unsigned short Random(unsigned long n);
       double fRandom(void);
};
 
RandomNumber::RandomNumber(unsigned long s)
{
       if(s == 0)
              randSeed = time(0);
       else
              randSeed = s;
}
 
unsigned short RandomNumber::Random(unsigned long n)
{
       randSeed = multiplier * randSeed + adder;
       return(unsigned short)((randSeed >> 16) % n);
}
 
double RandomNumber::fRandom(void)
{
       return Random(maxshort)/double(maxshort);
}
 
double Darts(long n)
{
       static RandomNumber dart;
       int k=0;
       for(int i = 1; i <= n; i++)
       {
              double x = dart.fRandom();
              double y = dart.fRandom();
              if(x*x + y*y <= 1) k++;
       }
       return 4*(k/double(n));
}
 
int main(int argc, char* argv[])
{
       long n = 10000000;       //1000
//     long n = 100000000; //1亿
//     long n = 1000000000; //10亿
       double pi = Darts(n);
       printf("%.10f/n",pi);
}
原创粉丝点击