如何计算x次尝试中出现特定连续结果的概率及Python代码问题排查
代码错误点梳理
- 遍历逻辑完全错误:
for i in list中i是每次抛硬币的结果,只能是0或1,不是列表的索引,后续list[i]只能访问列表前两位元素,每次实验最多只会检查索引0和1开头的连续6位序列,漏掉了剩下90多个可能的起始位置,自然很难检测到符合要求的连续序列,这是你结果远低于正常值的核心原因。正确写法是遍历合法的索引范围range(len(coin_flips)-5),同时避免后续取i+5时出现索引越界报错。 - 计数逻辑错误:当前代码只要匹配到连续6次就给
numberOfStreaks加1,单次实验中如果出现更长的连续序列(比如连续7次正面)会被重复计数,而题目要求单次实验只要出现至少一次连续6次就算有效,匹配到一次就应该终止当前实验的遍历,避免重复计数。 - 语法不规范:if条件换行时没有加续行符或者括号,不符合Python语法要求,实际运行会直接报错。
- 概率计算错误:总实验次数为10000次,正确的概率计算公式为
(有效实验次数 / 10000) * 100,原代码直接除以100的计算逻辑完全错误。 - 变量命名不规范:用Python内置类型名
list作为自定义变量名,会覆盖内置功能,属于不好的编码习惯,建议改为coin_flips这类语义明确的名称。 - 打印语句兼容问题:
print 'xxx'是Python2的语法,Python3中需要加括号写成print('xxx')。
修正后的参考代码
import random numberOfStreaks = 0 experiment_total = 10000 flip_count = 100 streak_length = 6 for _ in range(experiment_total): coin_flips = [random.randint(0, 1) for _ in range(flip_count)] has_streak = False # 遍历所有可能的连续序列起始位置 for i in range(flip_count - streak_length + 1): if all(coin_flips[i] == coin_flips[i+j] for j in range(streak_length)): has_streak = True break # 找到一次就跳出,不需要继续检查 if has_streak: numberOfStreaks += 1 chance = (numberOfStreaks / experiment_total) * 100 print(f'Chance of streak: {chance:.2f}%')
注:按题目要求统计连续6次正面或反面的概率,运行结果约为80%,你提到的1.5%大概率是记错了题目要求(比如仅统计连续6次正面、每次实验仅抛6次硬币等场景才会得到接近1.5%的结果)
内容的提问来源于stack exchange,提问作者uselessmoniker
相关产品推荐
相关产品推荐

