鱼C论坛

 找回密码
 立即注册
查看: 2076|回复: 7

[已解决]第16讲课后作业最后一题无法理解

[复制链接]
发表于 2022-12-11 23:42:15 | 显示全部楼层 |阅读模式

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

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

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,前面声明了last是=数字0的,(虽然前面一开始声明last=0的时候井号后面的中文告诉我正面是1反面是2,但这是解释给我们看的,python并不读懂这句话啊,代码此时肯定认为last是0啊)
可后面突然无中生有就来一句if last == 2:  我不明白为啥last会等于2,他为何不能是3或者4或者其他数字。
因为在last==2前面的代码中并没有出现last的计算。我认为他目前还是=0的。像其他的变量比如heads和c_heads,他们一开始声明=0,但是当num%2==0也就是偶数的时候,
heads和c_heads就会各加上1,这个很好理解,他们因为被声明+1了,此时他们就是1,这没啥好说的,但是last这个值又没有声明是怎么计算出来的。就突然来一句如果last == 2
实在是无法理解,不知道我的疑惑表达大伙能感同身受不,我怕我叙述了你们还听不懂....
最佳答案
2022-12-12 07:11:51
统计正反面次数不难理解
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:#num%2表示的是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="")
这个程序要理解他是怎么去统计连续次数的
就是用记录上一次的面,来和现在的面所对比,相等则不作改动(—因为连续的一直在记录)
                                                                   不等则把当前面数设为一(不然连续次数就会一直累加)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-12-12 06:57:40 | 显示全部楼层
多多少少新鱼油都有这种疑惑,先自己通读代码,尤其是IF ELSE那一部分,看看自己能理解吗,等一会我在把代码做一个详解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-12 07:11:51 | 显示全部楼层    本楼为最佳答案   
统计正反面次数不难理解
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:#num%2表示的是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="")
这个程序要理解他是怎么去统计连续次数的
就是用记录上一次的面,来和现在的面所对比,相等则不作改动(—因为连续的一直在记录)
                                                                   不等则把当前面数设为一(不然连续次数就会一直累加)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-12 07:13:12 | 显示全部楼层
重要的是代码41和58行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-12 07:14:10 | 显示全部楼层
就是来记录上一次以供以这一次对比的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-12 07:15:38 | 显示全部楼层
你可以通过举例来理解,假设情况为什么什么
再把情况带入到代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-12 07:18:01 | 显示全部楼层
再一个,这是一个循环,整体着看看,想想last=1(上一次是正)
                                                             last=2(上一次是反)
是从哪里来,怎么设的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-12 17:03:07 | 显示全部楼层
香蕉那个不拿拿 发表于 2022-12-12 07:11
统计正反面次数不难理解

这个程序要理解他是怎么去统计连续次数的

香蕉哥,非常谢谢你百忙之中抽空帮我理清了思路,我就是死脑筋,当我把代码从上到下依次自己在心里模拟程序自己跑几次数字过后,我就整明白了,确实代码41和58是关键,他记录了当下这把的正反面,惊叹于逻辑思维得多缜密才能解出这道题。这道题的前置那道我想了个把小时才答出来,最后这道确实昨晚想了一整晚没想出来。谢谢香蕉哥,谢谢!

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
香蕉那个不拿拿 + 1 + 1 感谢设置最佳答案

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-25 09:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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