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

《Python编程快速上手》第4章抛硬币实践项目两种解法错误求助

两个解法的错误分析

两个解法都完全偏离了原项目的实验逻辑,且存在多处语法和逻辑错误,具体如下:

解法1存在的问题

  • 硬币列表nextFlip定义在实验循环外部,每次实验都往同一个列表追加元素,所有实验数据堆叠,完全不符合「10000次独立抛硬币实验」的要求。
  • 连续6次相同的判断条件额外加了!= nextFlip[i+6]的限制,相当于要求连续6个相同面之后必须接不同的结果才计数,会漏掉连续7个及以上相同面的有效情况,不符合原项目「只要出现连续6个就算有效」的要求。
  • 统计streak的代码写在了单次抛硬币的循环内部,每新增1次抛硬币结果就遍历整个列表统计一次,重复计数问题极其严重,结果完全失真。
  • 遍历范围range(0,(len(nextFlip)-6))边界错误,range的上限是开区间,最终会漏掉列表末尾最后一组可能的连续6个元素的判断。

解法2存在的问题

  • 和解法1一样,nextFlip定义在循环外部,所有实验数据堆叠,没有每次实验重置列表。
  • 连续计数的hlist、tlist没有重置逻辑:出现不同面时不会把对应计数清零,统计的是累计出现6次H/T,而不是连续出现6次,逻辑完全错误。
  • 同样把统计代码写在单次抛硬币的循环内部,每加一个结果就统计一次,重复计数问题严重。
  • 遍历范围边界同样错误,漏判末尾的连续区间。

正确实现参考

原项目要求是:重复10000次实验,每次实验抛100次硬币,统计有多少次实验出现了至少1次连续6个相同面,最终计算概率,预期结果在80%左右。

import random
total_streak = 0
# 做10000次独立实验
for _ in range(10000):
    # 每次实验生成100次抛硬币结果
    flips = []
    for _ in range(100):
        flips.append('H' if random.randint(0,1) == 0 else 'T')
    # 统计本次实验是否有连续6个相同面
    current_streak = 1
    has_streak = False
    for i in range(1, len(flips)):
        if flips[i] == flips[i-1]:
            current_streak +=1
            if current_streak >=6:
                has_streak = True
                break
        else:
            current_streak = 1
    if has_streak:
        total_streak +=1

print('Chance of streak: %.2f%%' % ((total_streak / 10000)*100)) 

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:24:04