鱼C论坛

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

[已解决]python016课后作业求助

[复制链接]
发表于 2026-8-28 19:28:27 | 显示全部楼层 |阅读模式

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

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

x
需要显示随机抛硬币后的正反面次数和最大连续正反面次数,但是正面次数始终是2,不知道是出了什么问题。
最佳答案
2026-8-28 21:47:42
我找到问题了,当时你这个变量搞的我头昏眼花,一开始我以为是22行和27行的变量覆盖重置问题,但想了想并不是,而是代码的下半部分
   

  1.     if x == '正面' and y == '正面':
  2.             b0 += 1
  3.     if x == '反面' and y == '反面':
  4.             b1 += 1
  5.     else:
  6.             if b0 > c0:
  7.                     c0 = b0
  8.             if b1 > c1:
  9.                     c1 = b1
  10.     b0 = 1
  11.     b1 = 1

  12.     y = x
  13.     i = i + 1
复制代码

当 (x,y) 是“正正”时,第一个 if 执行,第二个 if 不执行,所以 else 不执行,但循环末尾仍然会强制把 连续正面 和 连续反面 重置为 1,这就把刚累加的连续值给覆盖掉了!

当 (x,y) 是“反反”时,第二个 if 执行,else 跳过,末尾同样强制重置为 1,也丢失了连续值。

只有当 (x,y) 不是“反反”时,才会进入 else 更新最大值,但更新完后末尾又强制重置为 1,这导致连续统计永远无法累积超过 1(除非在一次循环中连续两次都是正面,但重置后又归零,所以最大只能到 2)。


2. 循环结束没有最后更新最大值
如果最后一次连续(比如最后连续 5 次正面)没有遇到相反的来触发 else,那么最大值就不会被更新,仍然停留在之前的旧值。

3. 连续正 和 连续反 在每次循环末尾被强制重置为 1
无论当前连续状态如何,每次循环最后都执行 连续正 = 1; 连续反 = 1,这相当于每次循环都把当前连续计数归零,完全破坏了连续统计的逻辑
因此,你的这段代码应该改为

  1.     if x == '正面' and y == '正面':
  2.         b0 += 1
  3.     if x == '反面' and y == '反面':
  4.             b1 += 1
  5.     if b0 > c0:
  6.                 c0 = b0
  7.     if b1 > c1:
  8.                 c1 = b1

  9.     y = x
  10.     i = i + 1
复制代码

另外,你的程序还有一个致命错误,那就是如果用户输入的不是int字符,那你的程序就炸了,建议将原来的
  1. counts = int(input('请输入抛硬币的次数:'))
复制代码

替换为

  1. while True:
  2.     try:
  3.         counts = int(input('请输入抛硬币的次数:'))
  4.         if counts <= 0:
  5.             print('请输入一个正整数!')
  6.             continue
  7.         break
  8.     except ValueError:
  9.         print('输入无效,请输入一个整数!')
复制代码

另外你的代码已经违背DRY原则,可以尝试自定函数,将变量改为字典等等方式简化或美化,总之待有想法后这个方案可以完全重做
屏幕截图 2026-08-28 192408.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2026-8-28 19:28:56 | 显示全部楼层
可以先把你的代码贴出来吗?这样能最快定位问题。

不过从“正面次数始终是2”这个现象来看,多半是循环次数、随机调用位置或者计数方式写错了。常见原因有以下几种:

  • 循环次数写成了固定的 range(2),所以正面最多只可能累加到2。
  • 随机函数只调用了一次,后面循环里都在判断同一个结果。
  • 计数时用了 = 而不是 +=,把累加变成了赋值。
  • 最大连续次数的“当前连续值”没有在结果变化时清零。


给你一个完整正确的参考代码:


  1. import random

  2. n = int(input("请输入抛硬币次数:"))

  3. heads = 0
  4. tails = 0

  5. cur_h = 0
  6. cur_t = 0
  7. max_h = 0
  8. max_t = 0

  9. for _ in range(n):
  10.     result = random.choice(["正", "反"])

  11.     if result == "正":
  12.         heads += 1
  13.         cur_h += 1
  14.         cur_t = 0
  15.     else:
  16.         tails += 1
  17.         cur_t += 1
  18.         cur_h = 0

  19.     if cur_h > max_h:
  20.         max_h = cur_h
  21.     if cur_t > max_t:
  22.         max_t = cur_t

  23. print(f"正面次数:{heads}")
  24. print(f"反面次数:{tails}")
  25. print(f"最大连续正面次数:{max_h}")
  26. print(f"最大连续反面次数:{max_t}")
复制代码


重点检查一下你的循环是不是真的循环了用户输入的那麼多次,以及有没有把 heads += 1 写成了别的赋值语句。

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

使用道具 举报

发表于 2026-8-28 20:31:03 | 显示全部楼层
等待
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2026-8-28 20:31:27 | 显示全部楼层
ShireyFen 发表于 2026-08-28 20:31
FishC 发表于 2026-8-28 19:28
可以先把你的代码贴出 ...


很好,你发现了程序的健壮性问题。输入非数字时,int()函数无法将字符串转换成整数,就会抛出ValueError异常,程序直接崩溃。解决方法很简单,在转换前判断或者捕获异常即可。

给你一个改进版,同时处理了非数字输入和负数、零的情况:


  1. import random

  2. while True:
  3.     try:
  4.         n = int(input("请输入抛硬币次数:"))
  5.         if n <= 0:
  6.             print("次数必须为正整数,请重新输入。")
  7.             continue
  8.         break
  9.     except ValueError:
  10.         print("输入无效,请输入一个整数。")

  11. heads = 0
  12. tails = 0

  13. cur_h = 0
  14. cur_t = 0
  15. max_h = 0
  16. max_t = 0

  17. for _ in range(n):
  18.     result = random.choice(["正", "反"])

  19.     if result == "正":
  20.         heads += 1
  21.         cur_h += 1
  22.         cur_t = 0
  23.     else:
  24.         tails += 1
  25.         cur_t += 1
  26.         cur_h = 0

  27.     if cur_h > max_h:
  28.         max_h = cur_h
  29.     if cur_t > max_t:
  30.         max_t = cur_t

  31. print(f"正面次数:{heads}")
  32. print(f"反面次数:{tails}")
  33. print(f"最大连续正面次数:{max_h}")
  34. print(f"最大连续反面次数:{max_t}")
复制代码


重点说明:

  • try-except包裹输入转换,捕获ValueError,不会因为乱输入而崩溃。
  • 如果输入的是负数和零,用continue让用户重新输入,保证次数有意义。
  • 随机选择部分改成random.choice(["正", "反"]),确保正确。


这样程序就更加完善了。

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

使用道具 举报

发表于 2026-8-28 20:33:26 | 显示全部楼层
等会,我似乎粘贴了ai的代码,我看一下你代码,对了,我刚加入频道,你能告诉我怎么删评吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2026-8-28 21:05:23 | 显示全部楼层
ShireyFen 发表于 2026-8-28 20:33
等会,我似乎粘贴了ai的代码,我看一下你代码,对了,我刚加入频道,你能告诉我怎么删评吗

我也刚加频道,都不太明白操作hh。代码复制粘贴就可以了吗?还是需要把文件附上去啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-8-28 21:47:42 | 显示全部楼层    本楼为最佳答案   
我找到问题了,当时你这个变量搞的我头昏眼花,一开始我以为是22行和27行的变量覆盖重置问题,但想了想并不是,而是代码的下半部分
   

  1.     if x == '正面' and y == '正面':
  2.             b0 += 1
  3.     if x == '反面' and y == '反面':
  4.             b1 += 1
  5.     else:
  6.             if b0 > c0:
  7.                     c0 = b0
  8.             if b1 > c1:
  9.                     c1 = b1
  10.     b0 = 1
  11.     b1 = 1

  12.     y = x
  13.     i = i + 1
复制代码

当 (x,y) 是“正正”时,第一个 if 执行,第二个 if 不执行,所以 else 不执行,但循环末尾仍然会强制把 连续正面 和 连续反面 重置为 1,这就把刚累加的连续值给覆盖掉了!

当 (x,y) 是“反反”时,第二个 if 执行,else 跳过,末尾同样强制重置为 1,也丢失了连续值。

只有当 (x,y) 不是“反反”时,才会进入 else 更新最大值,但更新完后末尾又强制重置为 1,这导致连续统计永远无法累积超过 1(除非在一次循环中连续两次都是正面,但重置后又归零,所以最大只能到 2)。


2. 循环结束没有最后更新最大值
如果最后一次连续(比如最后连续 5 次正面)没有遇到相反的来触发 else,那么最大值就不会被更新,仍然停留在之前的旧值。

3. 连续正 和 连续反 在每次循环末尾被强制重置为 1
无论当前连续状态如何,每次循环最后都执行 连续正 = 1; 连续反 = 1,这相当于每次循环都把当前连续计数归零,完全破坏了连续统计的逻辑
因此,你的这段代码应该改为

  1.     if x == '正面' and y == '正面':
  2.         b0 += 1
  3.     if x == '反面' and y == '反面':
  4.             b1 += 1
  5.     if b0 > c0:
  6.                 c0 = b0
  7.     if b1 > c1:
  8.                 c1 = b1

  9.     y = x
  10.     i = i + 1
复制代码

另外,你的程序还有一个致命错误,那就是如果用户输入的不是int字符,那你的程序就炸了,建议将原来的
  1. counts = int(input('请输入抛硬币的次数:'))
复制代码

替换为

  1. while True:
  2.     try:
  3.         counts = int(input('请输入抛硬币的次数:'))
  4.         if counts <= 0:
  5.             print('请输入一个正整数!')
  6.             continue
  7.         break
  8.     except ValueError:
  9.         print('输入无效,请输入一个整数!')
复制代码

另外你的代码已经违背DRY原则,可以尝试自定函数,将变量改为字典等等方式简化或美化,总之待有想法后这个方案可以完全重做

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +3 收起 理由
小甲鱼的二师兄 + 3 + 3 + 3 鱼C有你更精彩^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2026-8-28 22:12:55 | 显示全部楼层
ShireyFen 发表于 2026-8-28 21:47
我找到问题了,当时你这个变量搞的我头昏眼花,一开始我以为是22行和27行的变量覆盖重置问题,但想了想并不 ...

哦哦好的我明白了!我还没学太久hh,谢谢你的指点
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-18 19:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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