在论坛看到 领悟者的涂鸦笔 发的帖子 矿工迷路时间 https://www.52pojie.cn/forum.php?mod=viewthread&tid=1397572&highlight=%BF%F3%B9%A4
颇有感触,仔细阅读后尝试自己也写一写,不敢说比原作者的有多好,毕竟也是实践,也拿出自己编写过程中发现很多问题,与自学的同仁共勉。
背景:
一个矿工在井下迷了路,迷路的地方有三个门,假设从第一个门出来,经过2小时可达安全之处;若从第二个门出来,经过3小时后会回到原地;若从第三个门出来,经过1小时后会回到原地。假定该人选择门是随机的,且始终无法区分这三个门,能够走到安全之处的平均用时是多少?
知识点:
判断语句
循环语句
列表
随机函数
一、根据三种情况写出判断
[Python] 纯文本查看 复制代码 import random
door=random.randint(1,3) # 设置门号
lost_time=[2,3,1] #选择门对应花费的时间
sum_time=0 # 总耗时
if door==1:
sum_time+=lost_time[0]
elif door==2:
sum_time+=lost_time[1]
elif door==3:
sum_time+=lost_time[2]
二、循环选门
door=1就结束,door==2或3时 还要回到原地,就用到了循环
[Python] 纯文本查看 复制代码 import random
lost_time=[2,3,1] #选择门对应花费的时间
sum_time=0 # 总耗时
conut_door1=0 # 非核心代码 计算选了几次第一个门
conut_door2=0 # 非核心代码 计算选了几次第二个门
conut_door3=0 # 非核心代码 计算选了几次第三个门
while True:
door=random.randint(1,3) # 设置门号 因为每一次选择门都会随机变换
if door==1:
sum_time+=lost_time[0]
conut_door1+=1
break # 选了一号门就出去了
elif door==2:
sum_time+=lost_time[1]
conut_door2+=1
elif door==3:
sum_time+=lost_time[2]
conut_door3+=1
print("一号门选了{}次,二号门选了{}次,三号门选了{}次".format(conut_door1,conut_door2,conut_door3)) # 非核心 供讲解使用
print("计算公式,{}*2+{}*3+{}*1={}".format(conut_door1,conut_door2,conut_door3,conut_door1*2+conut_door2*3+conut_door3)) # 非核心 供讲解使用
print(sum_time)
此时每次运行后就可得到单次走出去的时间
三、设置运行次数
[Python] 纯文本查看 复制代码 import random
lost_time=[2,3,1] #选择门对应花费的时间
sum_time=0 # 总耗时
for i in range(5): # 根据次数计算每次消耗时间
while True:
door=random.randint(1,3) # 设置门号 因为每一次选择门都会随机变换
if door==1:
sum_time+=lost_time[0]
break # 选了一号门就出去了
elif door==2:
sum_time+=lost_time[1]
elif door==3:
sum_time+=lost_time[2]
print(sum_time)
问题来了!!!!
经过测试发现随着测试次数的增大,总消耗时间大致呈线性趋势上升,肯定是不对的
通过阅读代码发现,sum_time 在循环外,每次循环都会叠加上一次的总时间,因此需要把它放到循环里。同样非核心代码里计算选门次数的代码,也要放到循环里
这也是我加入非核心代码(计算选门次数)的作用
解决它
[Python] 纯文本查看 复制代码 import random
lost_time=[2,3,1] #选择门对应花费的时间
for i in range(5):
sum_time=0 ####总耗时 这个特别特别重要#####
conut_door1=0 # 非核心代码 计算选了几次第一个门
conut_door2=0 # 非核心代码 计算选了几次第二个门
conut_door3=0 # 非核心代码 计算选了几次第三个门
while True:
door=random.randint(1,3) # 设置门号 因为每一次选择门都会随机变换
if door==1:
sum_time+=lost_time[0]
conut_door1+=1
break # 选了一号门就出去了
elif door==2:
sum_time+=lost_time[1]
conut_door2+=1
elif door==3:
sum_time+=lost_time[2]
conut_door3+=1
print("一号门选了{}次,二号门选了{}次,三号门选了{}次".format(conut_door1,conut_door2,conut_door3)) # 非核心 供讲解使用
print("计算公式,{}*2+{}*3+{}*1={}".format(conut_door1,conut_door2,conut_door3,conut_door1*2+conut_door2*3+conut_door3)) # 非核心 供讲解使用
print(sum_time)
四、优化增加次数选择
[Python] 纯文本查看 复制代码 import random
lost_time=[2,3,1] #选择门对应花费的时间
count=int(input("输入计算次数:")) # 注意此时别输入太大
for i in range(count):
sum_time=0 ####总耗时 这个特别特别重要#####
conut_door1=0 # 非核心代码 计算选了几次第一个门
conut_door2=0 # 非核心代码 计算选了几次第二个门
conut_door3=0 # 非核心代码 计算选了几次第三个门
while True:
door=random.randint(1,3) # 设置门号 因为每一次选择门都会随机变换
if door==1:
sum_time+=lost_time[0]
conut_door1+=1
break # 选了一号门就出去了
elif door==2:
sum_time+=lost_time[1]
conut_door2+=1
elif door==3:
sum_time+=lost_time[2]
conut_door3+=1
print("一号门选了{}次,二号门选了{}次,三号门选了{}次".format(conut_door1,conut_door2,conut_door3)) # 非核心 供讲解使用
print("计算公式,{}*2+{}*3+{}*1={}".format(conut_door1,conut_door2,conut_door3,conut_door1*2+conut_door2*3+conut_door3)) # 非核心 供讲解使用
print(sum_time)
五、将所有时间求和并除次数得到平均
[Python] 纯文本查看 复制代码 import random
lost_time=[2,3,1] #选择门对应花费的时间
count=int(input("输入运算次数:"))
all_time=[]
for i in range(count): # 根据次数计算每次消耗时间
sum_time=0 # 总耗时
while True:
door=random.randint(1,3) # 设置门号 因为每一次选择门都会随机变换
if door==1:
sum_time+=lost_time[0]
break # 选了一号门就出去了
elif door==2:
sum_time+=lost_time[1]
elif door==3:
sum_time+=lost_time[2]
all_time.append(sum_time) # 将每一次的时间加入到列表
print(all_time) # 打印列表
print(sum(all_time)) # 列表求和
print(sum(all_time)/count) # 求平均用时
六、最终呈现
[Python] 纯文本查看 复制代码 import random
lost_time=[2,3,1] #选择门对应花费的时间
count=int(input("输入运算次数:"))
all_time=[]
for i in range(count): # 根据次数计算每次消耗时间
sum_time=0 # 总耗时
while True:
door=random.randint(1,3) # 设置门号 因为每一次选择门都会随机变换
if door==1:
sum_time+=lost_time[0]
break # 选了一号门就出去了
elif door==2:
sum_time+=lost_time[1]
elif door==3:
sum_time+=lost_time[2]
all_time.append(sum_time) # 将每一次的时间加入到列表
# print(all_time) # 打印列表
# print(sum(all_time)) # 列表求和
print("经过{}次计算,平均逃生时间为{:.5f}小时".format(count,sum(all_time)/count)) # 求平均用时
今天就到这,请指点
|