蒙特卡洛法求Pi

编程实现如下模拟:

飞镖被随机地投掷到以(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函数是随机数发生器的初始化函数。
	*/
}

http://blog.csdn.net/smsmn/article/details/6338925

你可能感兴趣的:(蒙特卡洛法求Pi)