# 蒙特卡洛算法

> 每次计算都尽量尝试找【更好】的结果路径，但不保证是【最好】的结果路径。尝试次数越多，越有机会找到最优解。

我们来看看利用蒙特卡罗算法计算圆周率。

圆周率是通过 n 个多边形周长来推导计算出来的（可以参考附录），不过我们通过蒙特卡罗算法，也可以把圆周率计算出来。

**首先，我们构造一个正方形，里面套一个内切圆。**

**然后，我们在这个正方形的内部随机打上 1 万个点。**

**最后，根据它到中心点的距离来判断这个点是否落在圆的内部。**
这个落在圆内部的概率其实和这个圆与正方形之间的面积有一个比例关系。也就是假设落在圆内的概率为 P，则 P= 圆面积 / 正方形面积。
P=(π*R*R)/(2R*2R)= π/4也就是 π=4P。

如果我们的这些点是足够均匀分布的，那么圆内的点应该占到整个正方形里面点的π/4，所以只要把这个概率 P 乘以 4 就是π的值。

![圆](img/data-thinking/圆.png)

具体步骤如下：

1. 将圆心设在原点，以 R 为半径作圆，则第一象限的 1/4 圆面积为π*R*R/4；

2. 做该 1/4 圆的外接正方形，坐标为（0，0）（0，R）（R，0）（R，R），则该正方形面积为 R*R；

3. 随机取点（X，Y），使得 0<=X<=R 并且 0<=Y<=R，即点在正方形内；

4. 通过公式 X*X+Y*Y <RR 判断点是否在圆内；

5. 最后一共模拟了 N 次试验，一共有 M 个点在圆内，则 P=M/N，而π=4*M/N。
   
这个 N 就是蒙特卡洛算法的特点，N 越大，越接近π的真实值，但是你可以设置任何一个时刻停下来都会有一个接近正确答案的值。
我在一个平台上用这个算法进行计算，发现如果 N 是 1 万个点的话，它的结果是 3.1424。
是不是很神奇？我们并没有通过数学推导的方式，而是通过一个随机变量的方式来计算出我们的结果。
如果你要提高精确度，我们可以打上更多个点，那么它最终会越来越接近π真实值。