《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
相关产品推荐
相关产品推荐

