se6cxpp 发表于 2021-4-1 11:36

自学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))          # 求平均用时


今天就到这,请指点

liangqz 发表于 2021-4-1 11:44

牛皮,学习了

fdjskehs 发表于 2021-4-1 11:49

厉害了。我学的慢死了

跑得快有糖吃 发表于 2021-4-1 11:55

可怜的矿工:Dweeqw

日月与你 发表于 2021-4-1 12:10

厉害,学习了

bomengxiu 发表于 2021-4-1 12:53

太牛了。学习了!!

netsonicyxf 发表于 2021-4-1 13:28

本帖最后由 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

se6cxpp 发表于 2021-4-1 14:26

netsonicyxf 发表于 2021-4-1 13:28
用数学方法验证下答案:

假设平均时间是X


bingo
写这段代码的初衷就是用数学的方法不会算,哈哈哈

52changew 发表于 2021-4-1 19:08

来看看; 理解; 学习; 哈哈; 谢谢
页: [1]
查看完整版本: 自学python-2-‘’矿工迷路时间‘’ 之我见