今日主讲蒙特卡罗方法求圆周率π和绘制7段数码管
蒙特卡罗
蒙特卡罗方法就是撒点(也就是随机数),撒出无数点(尽量多的点),计算满足条件的点个数占总个数的比例,广泛应用于各类概率性问题,今天我们就用这个思想求π
如下图所示,对正方形区域进行撒点,用.random()得出点的x,y,然后用距离公式判断点是否在圆上
#π.py
from random import random
from time import perf_counter
DARTS = 1000*1000#dart中文意思是飞镖
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:
hits = hits + 1
pi = 4 * (hits/DARTS)#乘4是因为hits/DARTS求的是第一象限1/4圆的面积
print("圆周率值是: {}".format(pi))
print("运行时间是: {:.10f}s".format(perf_counter() - start))
结果具有存在随机性,偶然性,且因为撒点个数不多,有点不太精准
绘制七段数码管
难点:
#SevenDigitsDrawV2.py
import turtle, time
def drawGap(): #绘制数码管间隔
turtle.penup()
turtle.fd(5)
def drawLine(draw):#绘制单段数码管
drawGap()
turtle.pendown() if draw else turtle.penup()
turtle.fd(40)
drawGap()
turtle.right(90)
def drawDigit(d): #根据数字绘制七段数码管
drawLine(True) if d in [2,3,4,5,6,8,9] else drawLine(False)
#绘制2,3,4,5,6,8,9时第一笔是画的,以下代码考虑之后的六笔 画or不画
drawLine(True) if d in [0,1,3,4,5,6,7,8,9] else drawLine(False)
drawLine(True) if d in [0,2,3,5,6,8,9] else drawLine(False)
drawLine(True) if d in [0,2,6,8] else drawLine(False)
turtle.left(90)
drawLine(True) if d in [0,4,5,6,8,9] else drawLine(False)
drawLine(True) if d in [0,2,3,5,6,7,8,9] else drawLine(False)
drawLine(True) if d in [0,1,2,3,4,7,8,9] else drawLine(False)
turtle.left(180)
turtle.penup()
turtle.fd(20)
def drawDate(date):
turtle.pencolor("red")
for i in date:
if i == '-':
turtle.write('年',font=("Arial", 18, "normal"))
turtle.pencolor("green")
turtle.fd(40)
elif i == '=':
turtle.write('月',font=("Arial", 18, "normal"))
turtle.pencolor("blue")
turtle.fd(40)
elif i == '+':
turtle.write('日',font=("Arial", 18, "normal"))
#用font()确定字体系列,大小,样式normal(正常),italic(斜体)
#用-=+来判断写年月日
else:
drawDigit(eval(i))
def main():
turtle.setup(800, 350, 200, 200)
turtle.penup()
turtle.fd(-350)
turtle.pensize(5)
# drawDate('2018-10=10+')
drawDate(time.strftime('%Y-%m=%d+',time.gmtime()))
#按一定格式读出计算机中此时的时间,入门五讲过time库
turtle.hideturtle()
turtle.done()
main()
这段代码运用了time库和turtle库,前面都有讲过哦
今天的内容是不是有趣点了,当然也有点难了,好好理解吧!
88,明天见!!!