Python抛硬币模拟问题:多组独立实验统计连续6次同面次数
问题根因
- 核心问题是全局的
ListOfResults列表没有在每轮独立实验开始前重置,所有轮次的抛硬币结果会持续追加到同一个列表中,第一轮实验后列表长度为100,第二轮就变成200,后续统计逻辑也是基于累计的全量结果计算,完全不符合10组独立100次抛掷的实验要求。 - 次要问题是当前统计连续6次同面的逻辑用了三层嵌套循环,时间复杂度高,后续扩展到10000次实验时运行效率会非常低。
调整后代码
import random as rd experiment_times = 10000 # 可直接调整为需要的实验次数 has_streak_count = 0 # 统计出现过至少1次连续6次同面的实验轮数 ListOfStreaks = [] for _ in range(experiment_times): ListOfResults = [] # 每轮实验开始前清空结果列表,保证轮次独立 current_streak = 1 current_experiment_streaks = 0 # 生成本轮100次抛硬币结果 for _ in range(100): ListOfResults.append(rd.randint(0,1)) # 统计本轮连续6次同面的次数 for i in range(1, len(ListOfResults)): if ListOfResults[i] == ListOfResults[i-1]: current_streak +=1 if current_streak == 6: current_experiment_streaks +=1 # 若连续7次同面需计为2次重叠的连续6次,注释掉下面一行即可 # current_streak = 0 else: current_streak = 1 ListOfStreaks.append(current_experiment_streaks) if current_experiment_streaks > 0: has_streak_count +=1 print("每轮实验连续6次同面的次数统计:", ListOfStreaks) print(f"100次抛硬币出现至少1次连续6次同面的估算概率:{has_streak_count / experiment_times:.2%}")
调整说明
- 每轮实验开始前重新初始化
ListOfResults,保证每轮的100次抛掷结果完全独立,不会和其他轮次的结果混淆。 - 优化了连续同面统计逻辑,仅需单次遍历本轮的100次结果即可完成统计,时间复杂度从O(n²)降到O(n),跑10000次实验也能快速出结果。
- 新增了概率计算逻辑,直接统计出现过至少1次连续6次同面的实验轮数,除以总实验次数即可得到需要的估算概率。
内容的提问来源于stack exchange,提问作者Trey
相关产品推荐
相关产品推荐

