如何使用蒙特卡洛(Mento Carlo)方法计算PI(Π)值?(C语言实现)

                                须知少时凌云志,曾许人间第一流!


问题描述

如何用蒙特卡洛方法计算圆周率PI?


问题背景:

蒙特卡洛方法:也称统计模拟方法,是一种以概率统计理论为指导的数值计算方法。

20世纪40年代,在冯·诺伊曼,斯塔尼斯拉夫·乌拉姆和尼古拉斯·梅特罗波利斯在洛斯阿拉莫斯国家实验室为核武器计划工作时,发明了蒙特卡罗方法。因为乌拉姆的叔叔经常在摩纳哥的蒙特卡洛赌场输钱得名,而蒙特卡罗方法正是以概率为基础的方法

而在计算机领域指的是采用产生随机数的方法来模拟,进而统计时间发生的概率,从而求解正确答案,说白了就是概率统计。


解决方案:

提示:这里填写该问题的具体解决方案:

第一步:在一个正方形区域内产生若干点(点数的多少影响结果的准确性,点数越大,准确性越好)

如何使用蒙特卡洛(Mento Carlo)方法计算PI(Π)值?(C语言实现)_第1张图片

第二步:统计点在圆内的个数可从圆心算起,点到圆心的距离小于半径的点在圆内) 

如何使用蒙特卡洛(Mento Carlo)方法计算PI(Π)值?(C语言实现)_第2张图片

 第三步:圆内点的个数与正方形内点的个数之比为面积之比PI/4

                由此,可以求得PI值,下面看具体的代码实现:

#include 
#include 
#include 
double fun(int num);
int main()
{
	int n;
	printf("请输入产生随机点的数目:\n");
	scanf_s("%d", &n);

	printf("圆周率PI的值为: %f\n", fun(n));
	return 0;
}
double fun(int num)
{
	int numCount = 0;    //记录圆内的点数;
	double x = 0;
	double y = 0;
	srand((unsigned)time(NULL));   //以时间作为随机数产生的变量,让随机数“随机产生”;
	for (int i = 0; i < num; i++)
	{
		x = rand() / (double)(RAND_MAX);
		y = rand() / (double)(RAND_MAX);  //产生位于(0,1)区间内的随机点;
		if ((x * x) + (y * y) < 1)
			numCount++;

	}
	return (4.0 * numCount / num);

}

需要注意的有以下几点:

1.输入的点的个数越多,结果就越接近于3.1415926535·······

2.结尾返回的要是4.0*numCount而不是4*numCount,后者会返回整数值,舍掉小数部分;

3.随机数的产生,我们要生成在(0,1)范围内的随机数,而且一般生成的随机数是固定的,要真的做到随机,可以以时间作为变量生成随机数,这个部分小沐在后面发文章说明一下,最后希望大家关注小沐,因为小沐真的想秃头啊!如有不对之处,希望铁子们指正。

你可能感兴趣的:(c++,算法,概率论)