须知少时凌云志,曾许人间第一流!
如何用蒙特卡洛方法计算圆周率PI?
蒙特卡洛方法:也称统计模拟方法,是一种以概率统计理论为指导的数值计算方法。
20世纪40年代,在冯·诺伊曼,斯塔尼斯拉夫·乌拉姆和尼古拉斯·梅特罗波利斯在洛斯阿拉莫斯国家实验室为核武器计划工作时,发明了蒙特卡罗方法。因为乌拉姆的叔叔经常在摩纳哥的蒙特卡洛赌场输钱得名,而蒙特卡罗方法正是以概率为基础的方法
而在计算机领域指的是采用产生随机数的方法来模拟,进而统计时间发生的概率,从而求解正确答案,说白了就是概率统计。
提示:这里填写该问题的具体解决方案:
第一步:在一个正方形区域内产生若干点(点数的多少影响结果的准确性,点数越大,准确性越好)
第二步:统计点在圆内的个数(可从圆心算起,点到圆心的距离小于半径的点在圆内)
第三步:圆内点的个数与正方形内点的个数之比为面积之比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)范围内的随机数,而且一般生成的随机数是固定的,要真的做到随机,可以以时间作为变量生成随机数,这个部分小沐在后面发文章说明一下,最后希望大家关注小沐,因为小沐真的想秃头啊!如有不对之处,希望铁子们指正。