#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;
}
用随机投点法计算PI值
最新推荐文章于 2021-07-13 19:48:54 发布