您的位置:首页 > 其它

用随机投点法计算PI值

2015-12-11 13:16 288 查看
#include "iostream"
#include "ctime"
#include "iomanip"

using namespace std;

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);  //构造函数,默认值0表示由系统自动产生种子
unsigned short Random(unsigned long n);  //产生0:n-1之间的随机整数
double fRandom(void);  //产生[0:1)之间的随机实数
};

RandomNumber::RandomNumber(unsigned long s)  //产生种子
{
if(s==0)
randSeed = time(0);   //用系统时间产生种子
else
randSeed = s;     //用户提供种子
}

unsigned short RandomNumber::Random(unsigned long n)  //产生0:n-1之间的随机整数
{
randSeed = multiplier * randSeed + adder;
return (unsigned short) ((randSeed>>16)%n);  //高16位随机性较好,右移16位后,映射到(0~n-1)范围内
}

double RandomNumber::fRandom(void)  //产生[0,1)之间的随机整数
{
return Random(maxshort)/double(maxshort);  //产生0~(maxshort-1)间的随机整数,在除以maxshort
}

//用随机投点法计算PI值
double Darts(int n)
{
static RandomNumber dart;
int k = 0;
for(int i=1; i<=n; i++)
{
double x = dart.fRandom(); //横坐标[0,1)之间
double y = dart.fRandom(); //纵坐标[0,1)之间
if((x*x + y*y)<=1)      //如果落在圆内
k++;   //次数增加
}
return 4*k/double(n);  //所投点落入圆内的概率为 k/n = pi/4
}

int main()
{
const long num = 50000L;
double pi = Darts(num);
printf("PI=%f\n", pi);
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: