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))
修复说明
- 新增
has_streak标记,用于记录当前实验是否出现过连续6次序列 - 一旦发现连续6次,立即跳出检查循环,避免重复计数
- 每个实验仅在
has_streak为True时,给numberOfStreaks加1,确保每个实验最多计数一次
验证结果
修复后运行代码,输出概率约为80%左右,符合真实随机序列的概率规律。
内容的提问来源于stack exchange,提问作者Linkio
相关产品推荐
相关产品推荐

