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