You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 17:37:48