1. 程式人生 > >蒙特卡洛法求Pi

蒙特卡洛法求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函式是隨機數發生器的初始化函式。
	*/
}