【每周一坑】暴力计算圆周率 +【解答】生成/识别二维码
我们之前有出过一些和概率相关的问题。比如 几道有趣的概率题、三门问题、田忌赛马、蜥蜴流感与贝叶斯定理。我讲过,用计算机程序来解编程题有个很有意思的思路,就是暴力解法。就是利用电脑的计算能力,去模拟大量的情况(甚至所有情况),得出统计数据。这种方法虽然从数学角度来说不是绝对和精确的,但可以很方便地应付很多需求,以及作为计算结果的辅助验证。
更重要的一点,这种方法是非常的程序员思维,没接触过编程的人往往不会想到还可以用这种方式来解决问题。因此我也经常会提及此类问题。
今天我就再来抛一个问题:计算圆周率 π
古人发明了“割圆法”求圆周率。学过高等数学应该知道,π 可以通过无穷级数来精确计算。而有了计算机之后,我们还可以有更多种尝试。比如之前我也写过一篇 一个略奇葩的计算圆周率的程序,就是通过模拟布丰投针实验来粗略计算 π。除此之外,还可以有其他方法,这里给两个思路:
1、假设 R 为半径,生成 2R x 2R 的点阵,即 x = [-R, R], y = [-R, R]
,根据圆的定义:在同一平面内,到定点的距离等于定长的点的集合。可以计算出这些点里,哪些点属于圆的内部。当点数足够多时,这些点的数量就可以近似地看做圆的面积。再根据圆面积公式 S = π R²
,就可以反推出 π 的近似值。
2、思路同上一条类似,但不再使用规则点阵,而是在 [-R, R]
的范围内生成大量随机的点。最后根据圆内与圆外点的数量比例,推算 π 的近似值。这种采样方法也就是大名鼎鼎的蒙特卡洛方法(Monte Carlo method)。
你可以用上述的方式,也可以用你自己的方式,尝试算一下 π。
期待各位同学提交解答。详细解答和参考代码将在下次栏目中给出,也可以其他同学在留言中的代码。
提交代码可以使用 paste.ubuntu.com 或
codeshare.io 等代码分享网站,只需将代码复制上去保存,即可获得一个分享地址,非常方便。