鱼C论坛

 找回密码
 立即注册
查看: 24|回复: 5

[学习笔记] 那个投硬币的题可算做出来了,记录下

[复制链接]
发表于 3 小时前 From FishC Mobile | 显示全部楼层 |阅读模式

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

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

x
这题对萌新来说真难,一开始真是一点思路都没有,只能让豆包给了点思路,当然没有直接要代码。
1000078466.jpg
最后主要还是有两个地方没有想清楚,造成了思维误区
1,第一次比较的时候不知道x应该赋值多少才能正确
2,如果连续数断了,应该重新赋值为1而不是0。
这是我第一次写这么长的代码,大约有60多行,还是用的手机写的。差不多用两个小时,主要还是上边那俩问题,不停的反复实验。当然也多亏了豆包老师的指点,
自己独立思考敲出来的代码和抄别人写出来的代码就是不一样,这题我肯定能记住了,哈哈

import random

counts = int(input("请输入抛硬币的次数:"))
i = 0
n = 0  # 反面次数
m = 0  # 正面次数
x=None #记录上一次结果
y=0 #记录正面连续数
z=0 #记录正面最高连续数
a=0 #记录反面连续数
b=0 #记录反面最高连续数

print("开始抛硬币实验:")

while i < counts:
    # 1-10随机数,奇数=正面,偶数=反面
    num = random.randint(1, 10)
    if num % 2:
        m += 1
        # 次数≤100才打印结果
        if x==None:
            y+=1
        elif x==True:
            y+=1
        else:
            y=1  
        if y>=z:
            z=y
               
        if counts <= 100:
            print("正面", end=" ")
            print("x",x)
            print("y",y)
            print("z",z)
        x=True
            
    else:
        n += 1
        if x==None:
            a+=1
        elif x==False:
            a+=1
            
        else:
            a=1  
        if a>=b:
            b=a
            
        if counts <= 100:
            print("反面", end=" ")
            print("x",x)
            print("a",a)
            print("b",b)
        x=False
    # 只累加一次,避免跳步
    i += 1
   
        

print()  # 换行
print(f"一共模拟了{i}次抛硬币实验,结果如下:")
print(f"正面:{m}次")
print(f"反面:{n}次")
print(f"正面最高连续:{z}次")
print(f"反面最高连续:{b}次")

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 3 小时前 | 显示全部楼层
用户分享了自己解决投硬币问题的过程,并贴出了代码。作为计算机教育专家,我来给出反馈。


首先恭喜你!独立调试出60多行代码,还解决了两个关键思维误区,这种成就感比直接抄代码强多了。你提到的两点——第一次比较时x的初始值,以及连续断掉后重新赋值1而不是0——确实是新手容易卡壳的地方,能自己悟透说明你已经建立了“状态跟踪”的思维。

关于你的代码,逻辑完全正确,但有几个地方可以写得更简洁,方便以后维护:

  • 正面和反面分支里,判断x的部分其实可以合并。例如正面部分:
    1. if x is None or x is True: y += 1 else: y = 1
    复制代码
    反面同理。
  • 变量命名可以更直观:比如cur_consecutive表示当前连续数,max_consecutive表示最高连续数,避免用y、z、a、b混淆。
  • 打印调试信息时(当counts<=100),你打印了x、y、z,这是很好的调试习惯,但正式代码中通常会移除这类输出,或者用print(f"当前结果:{'正面' if num%2 else '反面'},正面连续数:{y},最高:{z}") 这样更清晰。
  • while i < counts控制次数时,别忘了在循环末尾写i += 1;你的代码里好像漏了这一点(可能复制时省略了?),记得补上。


最后给你一个更Pythonic的替代思路(仅参考,不改你的原有习惯):可以用if x == (num%2==1)来简化判断,因为x保存的是布尔值(正面=True, 反面=False),直接比较即可避免多次if。

再次为你独立完成这个练习点赞!代码长度不重要,重要的是你理解了“状态更新”和“边界处理”的精髓。继续保持这种思考习惯,后续学函数、类时会更加得心应手。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 3 小时前 From FishC Mobile | 显示全部楼层
FishC 发表于 2026-5-31 01:41
首先恭喜你!独立调试出60多行代码,还解决了两个关键思维误区,这种成就感比直接抄代码强多了。你提到 ...

你最后说的大概是这个意思哦
num=int(input())
x=None
if x==(num%2==1) or x==None:
    x=True
else :
    x=False
print(x)      
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 3 小时前 | 显示全部楼层
lisunli2011 发表于 2026-05-31 01:53
FishC 发表于 2026-5-31 01:41
首先恭喜你!独立调试 ...


你的思路挺好,但写出来的代码逻辑不太对。关键问题在于:

  • 条件 `x == (num%2==1)` 比较的是 x 的值(True/False/None)和当前结果布尔值。但此时 x 是 None,所以 `x == (num%2==1)` 恒为 False(因为 None 不等于任何布尔值)。
  • `x == None` 永远为 True,于是条件整体永远 True,导致 x 永远被赋为 True,永远不会出现 False,也就无法正确判断正反面的连续性。


正确的简化应该这样写(对照你原来的逻辑):每次记录当前结果 this_result,然后判断是否与上次相同:


  1. this_result = (num % 2 == 1)   # True=正面, False=反面
  2. if x is None:
  3.     # 第一次,直接计数为1
  4.     # 正、反分别处理...
  5.     pass
  6. elif this_result == x:
  7.     # 和上次相同,连续数+1
  8.     pass
  9. else:
  10.     # 不同,连续数重置为1
  11.     pass
  12. # 最后更新 x = this_result
复制代码


你不必非要把判断写在一个 if 条件里,拆开反而更清晰。你原来的代码虽然长一点,但逻辑完全正确,能独立写出来已经很棒了(尤其是用手机敲了60多行)!如果想进一步简化,可以参考这个结构,但不必强求合并条件。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 3 小时前 From FishC Mobile | 显示全部楼层
FishC 发表于 2026-5-31 01:53
你的思路挺好,但写出来的代码逻辑不太对。关键问题在于:



那个pass是什么意思
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 3 小时前 | 显示全部楼层
lisunli2011 发表于 2026-05-31 01:56
FishC 发表于 2026-5-31 01:53
你的思路挺好,但写出 ...


pass 是Python里的一个空语句,它的作用就是 **什么也不做**,只占一个位置。

比如你写一个条件判断,内部还没想好要写什么代码,但如果不写任何东西会报语法错误,这时候就可以写一个 pass 让程序能正常运行。

例如:
  1. if x > 0:
  2.     pass  # 暂时什么都不做,以后再来填代码
  3. else:
  4.     print("x 不是正数")
复制代码


你在代码里看到的 pass 是示例用的,实际写代码时,那个位置应该换成你真正的计数逻辑。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-5-31 05:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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