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

Python硬币连掷Streak计算程序结果超100%问题求助

硬币连续序列练习问题排查

练习背景

这是《Automate the Boring Stuff with Python》第二版中的「Coin flip streaks」练习,要求完成:

  • 每次实验生成100次掷硬币的结果序列(H表示正面,T表示反面)
  • 检查序列中是否存在连续6次H或T的情况
  • 重复10000次实验,计算出现过至少一次连续6次序列的实验占比

我的代码实现

import random
numberOfStreaks = 0
for experimentNUmber in range(10000):
    # Create a list of 100 heads or tails values.
    coinFlips = []
    for i in range(100):
        if random.randint(0, 1) == 0:
            coinFlips.append('H')
        else:
            coinFlips.append('T')

    # Check if there is a streak of 6 heads or tails in a row
    numberOfHeads = 0
    numberOfTails = 0
    for i in coinFlips:
        if i == 'H':
            numberOfHeads += 1
            numberOfTails = 0  # Reset the streak of tails
        elif i == 'T':
            numberOfTails += 1
            numberOfHeads = 0  # Reset the streak of heads
    
        if numberOfHeads == 6 or numberOfTails == 6:
            numberOfStreaks += 1
            numberOfHeads = 0  # Reset the streak of heads
            numberOfTails = 0  # Reset the streak of tails

print('Chance of streak: %s%%' % (numberOfStreaks / 100))

问题现象

运行代码后输出的概率在150%-153%之间,远超100%的合理范围。

错误原因分析

核心问题是重复计数:同一个实验中如果出现多次连续6次的情况(比如连续7次H会触发两次计数),代码会多次给numberOfStreaks加1,但题目要求的是每个实验只要出现过至少一次连续6次,就只算一次有效实验,而非统计所有连续6次的出现次数。

修复后的代码

import random
numberOfStreaks = 0
for experimentNumber in range(10000):
    # 生成100次掷硬币结果
    coinFlips = []
    for _ in range(100):
        coinFlips.append('H' if random.randint(0,1) == 0 else 'T')
    
    # 检查是否存在连续6次的序列
    has_streak = False
    current_streak = 1
    for i in range(1, len(coinFlips)):
        if coinFlips[i] == coinFlips[i-1]:
            current_streak += 1
            if current_streak >= 6:
                has_streak = True
                break  # 一旦发现连续6次,停止检查当前实验
        else:
            current_streak = 1
    
    if has_streak:
        numberOfStreaks += 1

print('Chance of streak: %s%%' % (numberOfStreaks / 100))

修复说明

  1. 新增has_streak标记,用于记录当前实验是否出现过连续6次序列
  2. 一旦发现连续6次,立即跳出检查循环,避免重复计数
  3. 每个实验仅在has_streak为True时,给numberOfStreaks加1,确保每个实验最多计数一次

验证结果

修复后运行代码,输出概率约为80%左右,符合真实随机序列的概率规律。

内容的提问来源于stack exchange,提问作者Linkio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 15:50:15