shengta 发表于 2026-8-28 19:28:27

python016课后作业求助

需要显示随机抛硬币后的正反面次数和最大连续正反面次数,但是正面次数始终是2,不知道是出了什么问题。

FishC 发表于 2026-8-28 19:28:56

可以先把你的代码贴出来吗?这样能最快定位问题。

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


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


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


import random

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

heads = 0
tails = 0

cur_h = 0
cur_t = 0
max_h = 0
max_t = 0

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

    if result == "正":
      heads += 1
      cur_h += 1
      cur_t = 0
    else:
      tails += 1
      cur_t += 1
      cur_h = 0

    if cur_h > max_h:
      max_h = cur_h
    if cur_t > max_t:
      max_t = cur_t

print(f"正面次数:{heads}")
print(f"反面次数:{tails}")
print(f"最大连续正面次数:{max_h}")
print(f"最大连续反面次数:{max_t}")


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

ShireyFen 发表于 2026-8-28 20:31:03

等待

FishC 发表于 2026-8-28 20:31:27

ShireyFen 发表于 2026-08-28 20:31
FishC 发表于 2026-8-28 19:28
可以先把你的代码贴出 ...

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

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


import random

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

heads = 0
tails = 0

cur_h = 0
cur_t = 0
max_h = 0
max_t = 0

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

    if result == "正":
      heads += 1
      cur_h += 1
      cur_t = 0
    else:
      tails += 1
      cur_t += 1
      cur_h = 0

    if cur_h > max_h:
      max_h = cur_h
    if cur_t > max_t:
      max_t = cur_t

print(f"正面次数:{heads}")
print(f"反面次数:{tails}")
print(f"最大连续正面次数:{max_h}")
print(f"最大连续反面次数:{max_t}")


重点说明:


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


这样程序就更加完善了。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

ShireyFen 发表于 2026-8-28 20:33:26

等会,我似乎粘贴了ai的代码,我看一下你代码,对了,我刚加入频道,你能告诉我怎么删评吗

shengta 发表于 2026-8-28 21:05:23

ShireyFen 发表于 2026-8-28 20:33
等会,我似乎粘贴了ai的代码,我看一下你代码,对了,我刚加入频道,你能告诉我怎么删评吗

我也刚加频道,都不太明白操作hh。代码复制粘贴就可以了吗?还是需要把文件附上去啊

ShireyFen 发表于 2026-8-28 21:47:42

我找到问题了,当时你这个变量搞的我头昏眼花,一开始我以为是22行和27行的变量覆盖重置问题,但想了想并不是,而是代码的下半部分
   
    if x == '正面' and y == '正面':
            b0 += 1
    if x == '反面' and y == '反面':
            b1 += 1
    else:
            if b0 > c0:
                    c0 = b0
            if b1 > c1:
                    c1 = b1
    b0 = 1
    b1 = 1

    y = x
    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,这相当于每次循环都把当前连续计数归零,完全破坏了连续统计的逻辑
因此,你的这段代码应该改为

    if x == '正面' and y == '正面':
      b0 += 1
    if x == '反面' and y == '反面':
            b1 += 1
    if b0 > c0:
              c0 = b0
    if b1 > c1:
              c1 = b1

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

while True:
    try:
      counts = int(input('请输入抛硬币的次数:'))
      if counts <= 0:
            print('请输入一个正整数!')
            continue
      break
    except ValueError:
      print('输入无效,请输入一个整数!')
另外你的代码已经违背DRY原则,可以尝试自定函数,将变量改为字典等等方式简化或美化,总之待有想法后这个方案可以完全重做

shengta 发表于 2026-8-28 22:12:55

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

哦哦好的我明白了!我还没学太久hh,谢谢你的指点
页: [1]
查看完整版本: python016课后作业求助