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

《Python编程快速上手》抛硬币序列习题代码输出异常排查

Python抛硬币连续序列实验代码排错

我正在学习《Automate The Boring Stuff with Python》(中文译名《Python编程快速上手:让繁琐工作自动化》),目前卡在章节练习上,练习具体要求如下:

练习内容

抛硬币连续序列实验:本练习将完成一项统计实验。若抛掷100次硬币,将正面记为“H”、反面记为“T”,最终会得到类似“T T T T H H H H T T”的结果序列。如果让人类手动编造100次随机抛硬币结果,往往会生成类似“H T H T H H T H T T”的正反交替结果——这类结果在人类视角下看似随机,但并不符合数学意义上的真随机特征。人类几乎不会主动写出连续6次正面或连续6次反面的序列,但这类长连续序列在真随机的抛硬币结果中出现概率极高,可见人类对随机性的感知存在可预测的偏差。

编写程序统计随机生成的硬币正反序列中,出现连续6次正面或连续6次反面的频率。程序分为两个部分:第一部分生成由随机选中的'heads'(正面)、'tails'(反面)值组成的序列;第二部分检查序列中是否存在符合要求的连续序列。将上述代码逻辑放入循环中重复实验10000次,最终计算存在至少一段连续6次同面结果的实验占比。提示:函数调用random.randint(0, 1)将以50%的概率返回0,剩余50%概率返回1。

原实现代码

import random
numI = 0
numII = 0
numberOfStreaks = 0
tHlists = []
for experimentNumber in range(10000):
    for i in range(100):
        if random.randint(0, 1) == 0:
            tHlists.append('T')
            numII = 0
            numI += 1
            if numI == 6:
                numberOfStreaks += 1
                numI =0
        else:
            tHlists.append('H')
            numI = 0
            numII += 1
            if numII == 6:
                numberOfStreaks += 1
                numII = 0
        
    
print('Chance of streak: %s%%' % (numberOfStreaks / 100))

问题现象

代码可正常运行,但输出平均结果为159.XX%,概率结果明显不符合逻辑。

错误点梳理

  • 统计目标偏差:题目要求统计10000次实验中,至少出现1次连续6次同面结果的实验占比,原代码统计的是所有实验过程中出现连续6次同面的总次数,单轮实验如果出现多段连续序列会被重复计数,和题目要求的统计维度完全不符。
  • 计数变量作用域错误:连续正面/反面的计数变量numI、numII定义在10000次实验的循环外层,上一轮实验结束后的剩余计数会被带入下一轮实验,导致跨实验误判连续序列,计数结果虚高。
  • 百分比计算错误:总实验样本量是10000次,原代码最终用numberOfStreaks / 100计算占比,分母取值完全错误。
  • 冗余代码:代码中定义的tHlists列表仅做追加操作,全程没有被读取调用,属于无效代码,会无意义占用内存。

修正后代码

import random

total_experiments = 10000
flip_count_per_experiment = 100
target_streak_length = 6
# 统计至少出现1次目标长度连续序列的实验数
streak_experiment_count = 0

for _ in range(total_experiments):
    current_streak = 1
    last_result = random.randint(0, 1)
    found_streak = False
    for _ in range(flip_count_per_experiment - 1):
        current_result = random.randint(0, 1)
        if current_result == last_result:
            current_streak += 1
            if current_streak == target_streak_length:
                found_streak = True
                break
        else:
            current_streak = 1
        last_result = current_result
    if found_streak:
        streak_experiment_count += 1

streak_probability = streak_experiment_count / total_experiments * 100
print('Chance of streak: %s%%' % streak_probability)

修正后代码运行结果稳定在80%左右,符合该实验的数学概率预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 17:21:34