今天学习了python的循环方面的知识,熟悉了一个随机数产生的random库,以及计算圆周率的案例。
关于圆周率,大家都很熟悉,很多人都能够背几位。但突然被问到,圆周率是怎样计算出来的?说实话有点懵了,不知是把以前知识忘了,还是压根就没学过。
不管是忘记了还是没学过,今天从头再来吧。和前面提到的一样,解决这类问题有两种方法,一种是数学公式的方法,另外一种是计算机思维的方法。
对于圆周率计算这个问题,有个无线逼近的数学公式法,公式写起来有点复杂,涉及python的知识点也不多。避免走偏了,先暂且忽视。
另外一种方法,也叫做蒙特卡罗法。在固定的区域内,随机撒大量的点,落在不同区域内点的个数,可以看作是两个区域面积的比值。
上面这个圆的面积,和灰色的正方形的的面积,比值正好是我们要求的π。我们可以在这个单位正方形中随机大量抛点,其中圆的面积正好是四分之一,统计圆内的点数和总点数的比值,乘上4倍,就可以求出π。
聊了这么多背景知识,直接上代码吧。
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里运行一遍,结果和以前学的差不多,每次计算小数点后面都有不同,把总次数加大一点,结果会好一些。
在讨论蒙特卡罗法和数学公式计算法那个更准确,如果有公式,自然公式比较准。但是,在解决日常的问题中,很多时候并没有现成的公式,借助计算机强大的算力,蒙特卡罗法显然效率更高。
另外,程序和很多事情一样,也遵循二八原则,在百分之二十的代码中,花费百分之八十的运行时间,而这百分之二十的代码部分,往往就是循环部分。
一个程序设计的好坏,运行效率的高低,往往就在于循环部分的设计,而学习别人优秀的程序设计,也可以从循环部分开始入手。
以上是今日所得,在写代码时,偶然想起今天讨论的间歇性努力的话题,在另外的角度又想了些东西。
只要是人,无论多自律,总是逃不掉间歇性努力的问题。有时真的很羡慕计算机,编好程序后,它就可以一直稳定持续地循环下去,直到有结果。
其实会间歇性努力的人类,并不见得比计算机差,只是目前还是这样的。
循环的东西,交给程序就好了。没有谁规定,计划好的事情,一定要不停地循环地做下去。人类没有这种束缚,人类可以随时调整方向,这也是优势。
埋头苦干,可能会错过生活中很多美好的东西,比如亲情,友情,健康,风景,精神生活。
但是,间歇性停止努力时,到底在做什么?是在思考人生,还是在刷抖音浪费时间?是做了些比计划任务更有意义的事,还是纯粹的偷懒?搞清楚这个非常关键。
计算机虽然傻乎乎地,一直按设定的程序计算,但是它至少不会浪费时间。如果每天间歇性地犯懒,却把时间花在毫无意义的事上,那真的连台机器也比不上了。
我不敢保证能将空闲时间,都花在有意义的事上面,所以还是先想办法埋头苦干吧。
end
往期推荐
为何我如此热爱优化师这个职业?
如果大家优化技术差不多,如何让账户效果更好?
毕小姐和信息流分手了