我在http://tieba.baidu.com/p/5953188922?traceid=看见了一个用 编程计算圆周率的方法 具体详细可以打开链接
发现原作者:百度用户阿泰 C531T因为编程语言的条件限制 故计算出的圆周率精确度有限 所以我这里教大家尝试用同样的算法用Python实现:
在此之前我们先来了解算法思路:
不知道各位是否记得自己做过这样一道数学题目:
在上面这个图形中,一个圆内切于一个正方形。假设正方形边长为 1,那么圆形的直径和正方形边长相等为 1,即半径为 0.5。
根据几何概型,向这个图形内随机抛一粒豆子,这粒豆子落入圆中的概率等于这个圆的面积占这个正方形的面积的比例。如果随机抛下的豆子足够多,那么落入圆中的豆子占所有豆子的比例,就近似等于这个圆的面积占这个正方形的面积的比例,即豆子落入圆中的概率。
设抛下的豆子总数为 n,落入圆中的豆子总数为 m,
则有 m/n=S圆/S正=𝜋𝑟 2/𝑎 2= 𝜋×0.5/1的平方= 0.25π
因此可估算出 𝜋= 4m/n
程序上实现如下:
界面中,横坐标轴(x 轴)、纵坐标轴(y 轴)、一个以原点为左下角且边长为 1 的
正方形和一个内切于正方形的圆【以点(0.5, 0.5)为圆心,半径为 0.5,标准方程为
(x-0.5)
2 +(y-0.5) 2 =0.25】已经画好。
这时点击一下窗口,就可以输入随机点个数。随机点就类似于随机抛下的豆子。
比如,输入随机点个数为 30000,结果如下
注意,为保证圆周率估算结果尽量准确、可靠,随机点个数就应该尽可能多,所以随机点个数设置了下限:1000 个。同时,为避免随机点个数过多,导致电脑崩溃、内存溢出,随机点个数也设置了上限:50000 个。
注意 这里原作者用VB设计故随机点个数的上限是50000 个
但如果我们用Python的随机数实现的话 随机点的上限将可以认为是无限的!!只要你的计算机足够强大!
from random import random # 随机函数
from time import perf_counter # 对程序运行计时
darts = 1000 * 10000 # 足够多的数目
hits = 0.0 # 目前在圆内部点的数目
start = perf_counter() # 当前系统时间
for i in range(1, darts + 1):
x, y = random(), random() # 生成随机坐标值
dist = pow(x ** 2 + y ** 2, 0.5) # 比较到圆心的距离是否为一
if dist <= 1.0: # 在圆内部加1
hits = hits + 1
if i % 1000 == 0:
print('目前的进度是{}%'.format(i*100/darts))
pi = 4 * (hits / darts)
print("圆周率值是:{}".format(pi))
print("运行时间是:{:.5f}s".format(perf_counter() - start))
这就是Python代码和解析
还是不明白的朋友没有关系 可以点一个关注 我会更新视频教程的!
感谢大家的观看!