基本思想:以坐标原点为圆心作一个半径为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);
}