列表连续相同元素统计问题:硬币抛掷模拟器漏统计末尾连续序列
硬币抛掷模拟器问题排查与修正
核心问题分析
你的代码存在两个关键错误,导致末尾连续6次结果漏统计,且实验逻辑完全失效:
外层循环逻辑错误
你写了10000次实验的循环,但每次循环都重新赋值results = [],最终只有最后一次实验的结果被保留,前9999次的结果全被覆盖,根本没参与统计。连续 streak 计数逻辑错误
current_streak初始值设为0,且每次遇到相同元素时加1,这意味着:
- 连续2次相同 →
current_streak=1 - 连续6次相同 →
current_streak=5
此时current_streak >=6的条件不满足,自然不会计数,这就是末尾连续6次漏统计的直接原因。另外,当前逻辑还会重复计数(比如连续7次会多次触发计数),不符合常规统计需求。
修正方案(对应《Automate The Boring Stuff》原挑战需求)
原挑战是统计10000次实验中,至少出现一次连续6次及以上相同结果的实验次数,进而计算概率。修正后的代码如下:
import random number_of_streaks = 0 for experiment_number in range(10000): # 生成单次实验的100次抛掷结果 results = [] for i in range(100): results.append('H' if random.randint(0, 1) == 0 else 'T') # 检查当前实验是否存在连续6次及以上的相同结果 current_streak = 1 # 单个元素自身算连续1次 has_streak = False for i in range(1, len(results)): if results[i] == results[i-1]: current_streak += 1 if current_streak >= 6: has_streak = True break # 找到后直接终止检查,提升效率 else: current_streak = 1 if has_streak: number_of_streaks += 1 # 输出结果 print(f"出现连续6次及以上相同结果的实验次数:{number_of_streaks}") print(f"对应概率:{number_of_streaks / 10000 * 100:.2f}%")
其他统计需求的修正方案
如果需要统计所有实验中总共有多少段连续6次及以上的相同结果(连续7次算1段,连续8次也算1段),可以用以下代码:
import random total_streaks = 0 for experiment_number in range(10000): results = [] for i in range(100): results.append('H' if random.randint(0, 1) == 0 else 'T') current_streak = 1 streak_recorded = False for i in range(1, len(results)): if results[i] == results[i-1]: current_streak += 1 if current_streak == 6 and not streak_recorded: # 第一次达到连续6次时计数,避免重复统计同一段 total_streaks += 1 streak_recorded = True else: current_streak = 1 streak_recorded = False print(f"总共有{total_streaks}段连续6次及以上的相同结果")
内容的提问来源于stack exchange,提问作者hburn
相关产品推荐
相关产品推荐

