编程实现如下模拟:
飞镖被随机地投掷到以(1,1)和(-1,-1)为对角的正方形内。若飞镖落在单位圆内【即以(0,0)为圆心,1为半径的圆】,算命中。否则未命中。
运行这个模拟并用它求PI的近似值。
模型如下图所示:
// Circle_PI.cpp : 定义控制台应用程序的入口点。
//
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <iomanip>
using namespace std;
const int MAX_DAST=100000; //投掷总数
double rand_double(double a,double b);
void rand_seed(); //设置随机数的种子
int main(void)
{
int PI_DAST=0; //投掷在圆里面的总数
rand_seed();
for(int i=0;i<MAX_DAST;i++)
{
double x=rand_double(-1,1);
double y=rand_double(-1,1);
if( x*x+y*y<=1)
PI_DAST++;
}
double PI=PI_DAST*4.0/MAX_DAST;
cout<<fixed;
cout<<"PI="<<PI<<endl;
system("pause");
return 0;
}
/**
生成某一区域内的随机浮点数
@param a 该区域的下边界
@param b 该区域的上边界
@param return 随机浮点数x,x∈[a,b]
*/
double rand_double(double a,double b)
{
return a+(b-a)*rand()*1.0/RAND_MAX;
/*
RAND_MAX是VC中stdlib.h中宏定义的一个字符常量:
#define RAND_MAX 0x7FFF
其值最小为32767,最大为2147483647
通常在产生随机小数时可以使用RAND_MAX。
*/
}
/**
设置随机数生成器的种子
*/
void rand_seed()
{
int seed=static_cast<int>(time(0)); //返回的是系统的时间
srand(seed);
/*
rand()产生伪随机数。srand函数提供种子,种子不同产生的随机数序列也不同,所以通常先调用srand函数,将time(0)的结果设置成种子。
srand函数是随机数发生器的初始化函数。
*/
}