吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2582|回复: 8
收起左侧

[Python 转载] 自学python-2-‘’矿工迷路时间‘’ 之我见

[复制链接]
se6cxpp 发表于 2021-4-1 11:36
在论坛看到 领悟者的涂鸦笔 发的帖子 矿工迷路时间 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))          # 求平均用时



今天就到这,请指点

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

liangqz 发表于 2021-4-1 11:44
牛皮,学习了
fdjskehs 发表于 2021-4-1 11:49
跑得快有糖吃 发表于 2021-4-1 11:55
日月与你 发表于 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
来看看; 理解; 学习; 哈哈; 谢谢
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 18:27

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表