用python计算圆周率的平方_德武的Python学习笔记(七):计算圆周率

5ae8bb8f06b2864d820ee9179198a5be.png 今天学习了python的循环方面的知识,熟悉了一个随机数产生的random库,以及计算圆周率的案例。 关于圆周率,大家都很熟悉,很多人都能够背几位。但突然被问到,圆周率是怎样计算出来的?说实话有点懵了,不知是把以前知识忘了,还是压根就没学过。 不管是忘记了还是没学过,今天从头再来吧。和前面提到的一样,解决这类问题有两种方法,一种是数学公式的方法,另外一种是计算机思维的方法。 对于圆周率计算这个问题,有个无线逼近的数学公式法,公式写起来有点复杂,涉及python的知识点也不多。避免走偏了,先暂且忽视。 另外一种方法,也叫做蒙特卡罗法。在固定的区域内,随机撒大量的点,落在不同区域内点的个数,可以看作是两个区域面积的比值。

0d95aaa583358fe1e4d053ae992150c6.png

上面这个圆的面积,和灰色的正方形的的面积,比值正好是我们要求的π。我们可以在这个单位正方形中随机大量抛点,其中圆的面积正好是四分之一,统计圆内的点数和总点数的比值,乘上4倍,就可以求出π。

b1111ecde6177fb7796f0a0746bd8a16.png

聊了这么多背景知识,直接上代码吧。
from random import randomfrom time import perf_counterDARTS=1000*2000hits=0.0start=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:        hits=hits+1pi=4*(hits/DARTS)print("圆周率值是:{}".format(pi))print("运行时间是:{:.5f}s".format(perf_counter()-start))
前两行代码,调用了random库中的random函数,以及time库中的perf_counter函数。 random 函数是用来产生0~1的随机小数的,在计算机中产生的随机数,其实都是一些伪随机数。 所谓的伪随机数,是给定一个种子数,通过梅森旋转算法,计算出来的数。如果没给定种子数,那就默认采用系统时间作为种子数。 这是计算机中随机数产生的原理,如果设计程序时,需要再现这个随机数,那可以用给定种子的方法,如果不需要,那就可以用默认的。 perf_counter 函数之前有提到过,是对程序运行进行计时的函数。 第三行DARTS=1000*2000,这里是将撒的点数,赋值给DARTS,这里是100万个。 第四行hits=0.0,这里是指目前在圆内的点的数量。 第五行start=perf_counter(),我们将启动时间的值,给变量start,开始计时。 第六行for i in range(1,DARTS+1):,这里是一个循环,在前面也有提过几次。这里将所有的抛撒点的过程,看作是一个循环。 第七行x,y=random(),random(),这里用x和y构建一个坐标,我们知道random函数产生的是0~1的小数,而正方形也设定的是单位正方形。所以组成的随机坐标,相当于每次在正方形中,随机撒一个点。 第八行dist=pow(x**2+y**2,0.5),用来判断是否落在圆内,我们通过计算与圆心的距离的方式。 第九行和第十行很简单,就是用来统计在圆内的个数,每次距离圆心距离小于1的话,hits变量就加1。 后面的三行,是循环结束后,计算π的过程。以及输出结果和运行时间结果,比较简单,不赘述。 在IDLE里运行一遍,结果和以前学的差不多,每次计算小数点后面都有不同,把总次数加大一点,结果会好一些。

8ab70c4844c0e2939dc05b4730865e76.gif

在讨论蒙特卡罗法和数学公式计算法那个更准确,如果有公式,自然公式比较准。但是,在解决日常的问题中,很多时候并没有现成的公式,借助计算机强大的算力,蒙特卡罗法显然效率更高。 另外,程序和很多事情一样,也遵循二八原则,在百分之二十的代码中,花费百分之八十的运行时间,而这百分之二十的代码部分,往往就是循环部分。 一个程序设计的好坏,运行效率的高低,往往就在于循环部分的设计,而学习别人优秀的程序设计,也可以从循环部分开始入手。 以上是今日所得,在写代码时,偶然想起今天讨论的间歇性努力的话题,在另外的角度又想了些东西。 只要是人,无论多自律,总是逃不掉间歇性努力的问题。有时真的很羡慕计算机,编好程序后,它就可以一直稳定持续地循环下去,直到有结果。 其实会间歇性努力的人类,并不见得比计算机差,只是目前还是这样的。 循环的东西,交给程序就好了。没有谁规定,计划好的事情,一定要不停地循环地做下去。人类没有这种束缚,人类可以随时调整方向,这也是优势。 埋头苦干,可能会错过生活中很多美好的东西,比如亲情,友情,健康,风景,精神生活。 但是,间歇性停止努力时,到底在做什么?是在思考人生,还是在刷抖音浪费时间?是做了些比计划任务更有意义的事,还是纯粹的偷懒?搞清楚这个非常关键。 计算机虽然傻乎乎地,一直按设定的程序计算,但是它至少不会浪费时间。如果每天间歇性地犯懒,却把时间花在毫无意义的事上,那真的连台机器也比不上了。 我不敢保证能将空闲时间,都花在有意义的事上面,所以还是先想办法埋头苦干吧。 6c13fb4ad07907e2d05b04dbff27cfd1.png

end

往期推荐

为何我如此热爱优化师这个职业?

如果大家优化技术差不多,如何让账户效果更好?

毕小姐和信息流分手了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值