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

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


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


问题描述

如何用蒙特卡洛方法计算圆周率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)范围内的随机数,而且一般生成的随机数是固定的,要真的做到随机,可以以时间作为变量生成随机数,这个部分小沐在后面发文章说明一下,最后希望大家关注小沐,因为小沐真的想秃头啊!如有不对之处,希望铁子们指正。😜😜😜