从随机抽样到几何逼近:三种圆周率计算方法解析
从随机抽样到几何逼近:三种圆周率计算方法解析
圆周率(π)是一个在数学和物理学中广泛应用的常数,其值约为3.14159。计算圆周率的方法有很多,其中一些方法在计算机科学中特别受欢迎,因为它们可以很容易地用程序实现。本文将介绍几种常见的计算圆周率的方法,包括蒙特卡洛模拟、割圆法和公式法。
1. 蒙特卡洛模拟算法
蒙特卡洛模拟是一种通过随机抽样来解决问题的方法。在计算圆周率的问题中,我们可以使用蒙特卡洛方法来估算π的值。
假设有一个半径为1的圆,如图所示。先绘制一个半径为1的圆。则图中阴影部分(1/4圆)的面积就等于π/4。
再绘制出一个正方形,可以看出它的面积是1。通过这种方式,就能够获取到正方形面积和阴影部分面积的一个比例。如此可得到正方形和阴影面积的比例关系1:π/4。这是通过数学上提供的计算面积的公式,得到的一个比例。
另外,我们可以生成很多点。然后把它们随机、均匀地铺到正方形里面去。这时候,我们可以认为这些点模拟出正方形的面积。另外我们需要计算出有哪些点落在了阴影部分。这种方式也能够获取到正方形和阴影部分面积的比例。这个比例和我们前面通过数学公式所求出的比例是一种恒等于的关系,我们利用这种恒等关系,就能够很轻松地获取到这个圆周率。
下面我们看一下这个代码应该如何实现:
第一步利用随机函数产生很多点(横坐标的值x和纵坐标的值y都在0~1之间)随机、均匀散满在正方形内。且统计出散落在阴影部分点的数量。获取正方形内点的数量和阴影部分点的数量的比例。显然,此比例和前面通过公式计算两者面积的比例具有恒等于关系。通过此关系便可计算出圆周率。
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
using namespace std;
int main(int argc, char** argv) {
//随机种子
srand( time(0) );
double num=10000000;
double circle=0;
//random 伪随机数(算法)
for(int i=1; i<num; i++) {
double x= rand() / double(RAND_MAX);
}
需要注意的是,上述代码只是一个框架,完整的实现还需要计算落在1/4圆内的点的数量,并根据比例计算出π的值。
2. 割圆法
割圆法是一种通过多边形逼近圆的方法来计算圆周率。古希腊数学家阿基米德最早使用了这种方法。基本思想是通过不断增加多边形的边数,使其越来越接近圆的形状,从而计算出圆周率的近似值。
3. 公式法
公式法是通过数学公式直接计算圆周率。其中最著名的是莱布尼茨公式:
π/4 = 1 - 1/3 + 1/5 - 1/7 + ...
这个公式虽然简单,但是收敛速度很慢,需要计算很多项才能得到一个相对准确的π值。
总结
以上介绍了三种计算圆周率的方法,每种方法都有其特点和适用场景。在实际应用中,可以根据具体需求选择合适的方法。
本文原文来自CSDN