公众号:编程驿站
圆周率的常见几种求解算法,包括但不仅仅包含特卡洛模拟、割圆法和公式法。本文讲解这几种算法的实现流程。
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);