python016课后作业求助
需要显示随机抛硬币后的正反面次数和最大连续正反面次数,但是正面次数始终是2,不知道是出了什么问题。 可以先把你的代码贴出来吗?这样能最快定位问题。不过从“正面次数始终是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-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 小助理,如未能正确解答您的问题,请继续追问。 等会,我似乎粘贴了ai的代码,我看一下你代码,对了,我刚加入频道,你能告诉我怎么删评吗
ShireyFen 发表于 2026-8-28 20:33
等会,我似乎粘贴了ai的代码,我看一下你代码,对了,我刚加入频道,你能告诉我怎么删评吗
我也刚加频道,都不太明白操作hh。代码复制粘贴就可以了吗?还是需要把文件附上去啊 我找到问题了,当时你这个变量搞的我头昏眼花,一开始我以为是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原则,可以尝试自定函数,将变量改为字典等等方式简化或美化,总之待有想法后这个方案可以完全重做 ShireyFen 发表于 2026-8-28 21:47
我找到问题了,当时你这个变量搞的我头昏眼花,一开始我以为是22行和27行的变量覆盖重置问题,但想了想并不 ...
哦哦好的我明白了!我还没学太久hh,谢谢你的指点
页:
[1]