/*
从网上看到一篇文章,介绍用概率方法验证圆周率π的文章,觉得很好玩,这里用c++编个小程序也试一试,看看结果如何。
原理:
1、一个正方形的内接圆,圆半径设为1,可知:圆的面积为π,正方形的面积为4,其比值π/4。
2、假设降落在正方形中的雨滴是随机落到内接圆内或外的,且分布是均匀的;那么在雨滴数量足够多时内接圆内的雨滴数可以近似看做内接圆的面积,同样落在正方形内的雨滴数可以近似看做是正方形的面积。
3、现在,用一个不断产生随机数的有限次(数值应足够大)循环代表雨滴,用两个随机数表示雨滴的x、y坐标,如果x*x+y*y<=1,说明落在圆内,统计圆内的点数及总点数其比值也应趋近于π/4,即比值乘4为π的验证值。
4、为简化计算,我们只取这个正方形及内接圆的1/4即第一象限部分;这样当圆半径为1时,x、y的取值范围均为0到1之间。
5、详细见后附代码。
*/
#include<iostream>
#include<string>
using namespace std;
#include<time.h> //随机数种子需要包含
#include<stdlib.h>//随机数函数需要包含
int main() {
srand((int)time(0));//生成随机数种子
long Num; //定义循环次数(总点数)
long Count=0;//记录圆内点数
cout << "请输入循环次数:";
cin >> Num;//输入循环次数
double point_X;//定义随机点坐标
double point_Y;
for (long i = 0; i < Num; i++) { //进行总数为Num的循环
point_X = (double)rand()/ (double)RAND_MAX;//产生0-1之间的随机数
point_Y = (double)rand()/ (double)RAND_MAX;
if (point_X * point_X + point_Y * point_Y <= 1) { Count++; };//统计圆内随机坐标点数
}
cout << "总 点 数:" << Num << endl;
cout << "圆内点数:" << Count << endl;
cout << "π估算值:" << (4*(double)Count / (double)Num) << endl;
system("pause");
return 0;
}
/*
分析:
1、取循环次数10,000,000次,运行5次程序得出的π估计值:
3.14102 3.14106 3.14226 3.14152 3.14149
可以看出生成的两位小数已经非常稳定,与π的实际值相同。
2、取循环次数50,000,000次运行5次程序,得出的π估计值:
3.14135 3.14194 3.14152 3.14165 3.14149
可以看出生成的三位小数已经非常稳定,与π的实际值相同。
可以看出,随着循环次数的增加,越来越接近于π的实际值,但由于使用的数据类型等因素的影响,肯定有一个极限值。有兴趣的话,请进一步验证。
*/