100次抛硬币正反连续streak计算异常,求代码逻辑排查
问题排查:抛硬币连续 streak 计算异常的原因
你的代码里的问题不是嵌套if语句导致的,而是循环遍历方式、索引处理以及初始值设置这几个地方出了问题,我来帮你逐一拆解:
1. 遍历列表时混淆了「元素值」和「索引」
你用了 for i in headOrTail:,这里的i是列表里的硬币结果(0或1),而不是列表的索引!
比如当headOrTail里的元素是0时,headOrTail[i]就等于headOrTail[0],永远取第一个元素;当元素是1时,就取第二个元素。这完全不是你想要的「当前元素和前一个元素比较」的逻辑。
正确的做法是通过索引遍历,从第1个元素开始(因为第0个元素没有前一个可以比较):
for i in range(1, len(headOrTail)):
2. streakCounter 的初始值和计数逻辑错误
你的streakCounter初始设为0,但实际上,每一个硬币本身就是1次连续的开始。比如第一次抛硬币结果是0,那当前连续次数是1;如果第二次也是0,连续次数就变成2,以此类推。
另外,当连续次数达到6时,你直接把streakCounter重置为0,这会导致如果出现超过6次的连续(比如7次),后续的连续会被打断,无法统计到重叠的streak(比如第2-7次的连续6次)。如果你的需求是统计所有出现连续6次的情况(包括重叠),应该只将streakCounter减1(或者不重置,继续累加);如果只统计独立的连续事件(连续7次只算1次),重置为0是合理的。
3. 抛硬币次数多了一次
你写的range(101)会生成101次抛硬币结果,但你说的是100次,应该改成range(100)。
修正后的代码
import random numberOfStreaks = 0 streakCounter = 1 # 初始为1,因为第一个元素本身算1次连续 headOrTail = [] # 生成100次抛硬币结果 for coinFlip in range(100): result = random.randint(0, 1) headOrTail.append(result) print(headOrTail) # 遍历列表,从第2个元素开始(索引1) for i in range(1, len(headOrTail)): if headOrTail[i] == headOrTail[i-1]: streakCounter += 1 # 当连续次数达到6时,计数+1 if streakCounter == 6: numberOfStreaks += 1 # 可选:如果要统计重叠的streak,把下面一行改成 streakCounter = 5 streakCounter = 0 # 按原逻辑重置,统计非重叠的连续事件 else: streakCounter = 1 # 不连续时重置为1,当前元素是新连续的开始 print(numberOfStreaks)
额外说明
- 如果你的需求是统计出现连续6次的独立事件次数(比如连续7次只算1次),保持
streakCounter = 0即可; - 如果是统计所有连续6次的片段数(比如连续7次算2次:第1-6、第2-7),改成
streakCounter = 5,这样下一次相同结果时,streakCounter会再次达到6并触发计数。
内容的提问来源于stack exchange,提问作者ximeng86
相关产品推荐
相关产品推荐

