From : http://blog.csdn.net/zzhflyqh/archive/2008/04/13/2288722.aspx
背景知识:
蒙特卡洛是摩纳哥公国第一大城市,与澳门、美国拉斯维加斯并称世界三大赌城。位于地中海沿岸,首都摩纳哥之北,建于阿尔卑斯山脉突出地中海的悬崖之上。景色优美,是地中海地区旅游胜地。市内建有豪华的旅馆、俱乐部、歌剧院、商店、游泳池、温泉浴室、运动场等娱乐设施 。城内开设有蒙特卡洛大赌场。赌场建于 1865 年,为双层楼建筑,上有钟楼、塔厅和拱形亭阁,还饰以若干人物雕塑,庭前棕榈树成行,还辟有花园,旁边有大酒店和酒吧间。整个城市在旺季时,约有赌场 70 多个,约有赌室 3500 间左右。蒙特卡罗赌场由国家经营。当地的其他活动,许多也带有赌博色彩。游客住的旅店房间,有抽奖的号码,中奖的免付部分房费。早餐的牛奶麦片粥里,如遇上金属牌子 ,亦可领奖。该城只有 1 万人口,但每天报纸销量可达 100 万份 ,因为报纸上都印有可能得奖的号码。游客最后离境,购买的车票上也印有彩票号码,于离境前开彩。经营赌业是摩纳哥的主要经济来源,每年都从赌业中收取高额外汇利润。
蒙特卡洛算法简单描述:
以 概率和统计理论方法为基础的一种计算方法。将所求解的问题同一定的概率模型相联系,用计算机实现统计模拟或抽样,以获得问题的近似解。比如,给定 x=a ,和 x=b ,你要求某一曲线 f 和这两竖线,及 x 轴围成的面积,你可以起定 y 轴一横线 y=c 其中 c>=f(a) and c>=f(b) ,很简单的,你可以求出 y=c,x=a,x=b, 及 x 轴围成的矩形面积,然后利用随机参生生大量在这个矩形范围之类的点,统计出现在曲线上部点数和出现在曲线下部点的数目,记为: doteUpCount,nodeDownCount, 然后所要求的面积可以近似为 doteDownCounts 所占比例 * 矩形面积。
问题描述:
在数值积分法中,利用求单位圆的 1/4 的面积来求得 Pi/4 从而得到 Pi 。单位圆的 1/4 面积是一个扇形,它是边长为 1 单位正方形的一部分。只要能求出扇形面积 S1 在正方形面积 S 中占的比例 K=S1/S 就立即能得到 S1 ,从而得到 Pi 的值。怎样求出扇形面积在正方形面积中占的比例 K 呢?一个办法是在正方形中随机投入很多点,使所投的点落在正方形中每一个位置的机会相等看其中有多少个点落在扇形内。将落在扇形内的点数 m 与所投点的总数 n 的比 m/n 作为 k 的近似值。 P 落在扇形内的充要条件是 x^2+y^2<=1 。
程序描述:
利用蒙特卡洛算法近似求圆周率PI
VC++6.0
ZZH
*/
#include < iostream >
#include < cmath >
#include < ctime >
#define COUNT 500000 // 循环取样次数
using namespace std;
bool InCircle( double x, double y) // 是否在1/4圆范围之内
{
if ((x * x + y * y) <= 1 ) return true ;
return false ;
}
void main()
{
double x,y;
int num = 0 ;
int i;
srand((unsigned)time(NULL));
for (i = 0 ;i < COUNT;i ++ )
{
x = rand() * 1.0 / RAND_MAX;
y = rand() * 1.0 / RAND_MAX;
if (InCircle(x,y)) num ++ ;
}
cout << " PI: " << (num * 4.0 ) / COUNT << endl;
}
结果:测试 5 次的结果显示: 3.13958 , 3.14041 , 3.13729 , 3.13859 , 3.14186