鱼C论坛

 找回密码
 立即注册
查看: 1893|回复: 3

[已解决]请教下这里变量last的逻辑是啥

[复制链接]
发表于 2022-11-8 16:35:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
import random

counts = int(input("请输入抛硬币的次数:"))

# 利用 ignore 变量来判断是否打印每次的结果
if counts > 100:
    ignore = True
else:
    ignore = False

heads = 0 # 统计正面的次数
tails = 0 # 统计反面的次数

last = 0 # 记录上一次的状态,如果是正面设置为1, 反面则设置为2
c_heads = 0 # 统计连续正面的次数
c_tails = 0 # 统计连续反面的次数
max_heads = 0 # 统计连续正面的最多次数
max_tails = 0 # 统计连续反面的最多次数

i = 0
print("开始抛硬币实验……")
while i < counts:
    num = random.randint(1, 10)

    if num % 2:
        heads += 1
        c_heads += 1

        if not ignore:      
            print("正面", end=" ")

        # 如果上一次是反面:将连续正面的次数设置为1
       if last == 2:
            c_heads =
1

        # 判断连续正面的次数是否比max_heads大,如果是,取而代之
        if c_heads > max_heads:
            max_heads = c_heads

        # 将上一次的状态设置为正面
       last = 1
    else:
        tails += 1
        c_tails += 1
        
        if not ignore:
            print("反面", end=" ")

        # 如果上一次是正面:连续反面的次数设置为1
        if last == 1:
            c_tails = 1

        # 判断连续反面的次数是否比max_tails大,如果是,取而代之
        if c_tails > max_tails:
            max_tails = c_tails

        # 将上一次的状态设置为反面
        last = 2
        
    i += 1

print("")
print("一共模拟了", counts, "次抛硬币,结果如下:")
print("正面:", heads, "次", sep="")
print("反面:", tails, "次", sep="")
print("最多连续正面:", max_heads, "次", sep="")
print("最多连续反面:", max_tails, "次", sep="")



这里变量last在这个 循环是怎么实现的, if last == 2: 从循环中哪里去判断的 我搞不懂逻辑啊啊啊啊啊 然后最后为啥又要设置为1
最佳答案
2022-11-8 16:54:39
本帖最后由 jackz007 于 2022-11-8 18:20 编辑

        把循环稍微简化一下,去掉无关代码,你就可以看到 last 的逻辑了
while i < counts:
    num = random . randint(1, 10)
    if num % 2:
. . . . . .
       last = 1
    else:
. . . . . .
       last = 2
    i += 1
        是的,last 指示的是上一次抛币的结果,last = 1,是正面,last = 2,是反面。如果本次是正面,上一次也是正面,那就是连续正面,否则,就是终结上一个连续背面,开始新的连续正面;如果本次是背面,上一次也是背面,那就是连续背面,否则,就是终结上一个连续正面,开始新的连续背面。
        下面是简化版的代码,希望能帮助你好理解一些
import random

counts = int(input("请输入抛硬币的次数:"))
heads = max_heads = c_heads = tails = max_tails = c_tails = last = 0
print("开始抛硬币实验……")
for i in range(counts):
    num = random . randint(1 , 10)
    if num % 2:
        if last == 2:
            if c_tails > max_tails : max_tails = c_tails
            c_tails = 0
        heads += 1
        c_heads += 1
        last = 1
    else:
        if last == 1:
            if c_heads > max_heads : max_heads = c_heads
            c_heads = 0
        tails += 1
        c_tails += 1
        last = 2
    if counts < 100:
        print("正面", end = " ")  if last == 1 else print("背面", end = " ")
print("")
print("一共模拟了", counts, "次抛硬币,结果如下:")
print("正面:", heads, "次", sep="")
print("反面:", tails, "次", sep="")
print("最多连续正面:", max_heads, "次", sep="")
print("最多连续反面:", max_tails, "次", sep="")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-8 16:54:39 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-11-8 18:20 编辑

        把循环稍微简化一下,去掉无关代码,你就可以看到 last 的逻辑了
while i < counts:
    num = random . randint(1, 10)
    if num % 2:
. . . . . .
       last = 1
    else:
. . . . . .
       last = 2
    i += 1
        是的,last 指示的是上一次抛币的结果,last = 1,是正面,last = 2,是反面。如果本次是正面,上一次也是正面,那就是连续正面,否则,就是终结上一个连续背面,开始新的连续正面;如果本次是背面,上一次也是背面,那就是连续背面,否则,就是终结上一个连续正面,开始新的连续背面。
        下面是简化版的代码,希望能帮助你好理解一些
import random

counts = int(input("请输入抛硬币的次数:"))
heads = max_heads = c_heads = tails = max_tails = c_tails = last = 0
print("开始抛硬币实验……")
for i in range(counts):
    num = random . randint(1 , 10)
    if num % 2:
        if last == 2:
            if c_tails > max_tails : max_tails = c_tails
            c_tails = 0
        heads += 1
        c_heads += 1
        last = 1
    else:
        if last == 1:
            if c_heads > max_heads : max_heads = c_heads
            c_heads = 0
        tails += 1
        c_tails += 1
        last = 2
    if counts < 100:
        print("正面", end = " ")  if last == 1 else print("背面", end = " ")
print("")
print("一共模拟了", counts, "次抛硬币,结果如下:")
print("正面:", heads, "次", sep="")
print("反面:", tails, "次", sep="")
print("最多连续正面:", max_heads, "次", sep="")
print("最多连续反面:", max_tails, "次", sep="")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-8 20:10:55 | 显示全部楼层
本帖最后由 zj1522989 于 2022-11-8 20:12 编辑
jackz007 发表于 2022-11-8 16:54
把循环稍微简化一下,去掉无关代码,你就可以看到 last 的逻辑了

        是的,last 指示的是 ...


if last == 2:
            if c_tails > max_tails : max_tails = c_tails
            c_tails = 0
为什么在判断正面的条件里 统计的是连续反面的最大次数,然后 if last == 2:的启动条件是else后将last变为2 才启动吗(新手对这种多层嵌套的执行逻辑不是很懂)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-8 20:21:19 | 显示全部楼层
zj1522989 发表于 2022-11-8 20:10
if last == 2:
            if c_tails > max_tails : max_tails = c_tails
            c_tails = 0 ...

       原因是连续背面就要结束了,看看当前连续背面的计数是否大于 max_tails,如果是,那就刷新 max_tails,后面紧接着就是初始化 c_tails = 0, 因为只有这个时候才是初始化 c_tails 的唯一时机。下一次如果是背面,c_tails 是要开始直接从头(0)开始计数的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-25 17:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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