Python抛硬币求连续6次正反面概率代码结果异常排查
代码问题排查与修复方案
核心问题1:条件判断逻辑错误
代码中if result[i:i+6] == ([0,0,0,0,0,0] or [1,1,1,1,1,1])的写法存在逻辑缺陷。Python中or运算符会返回第一个为真的结果,非空列表本身就是真值,因此该表达式实际只会返回[0,0,0,0,0,0],相当于代码仅检测了连续6次反面的情况,完全遗漏了连续6次正面的判定,直接导致统计结果大幅低于理论值。
问题2:遍历范围覆盖不全
当前遍历区间range(len(result)-6)无法覆盖所有可能的连续6次结果:100次抛硬币的列表长度为100,len(result)-6等于94,i的最大取值为93,对应的切片是result[93:99],漏掉了最后一组可能的连续6次切片result[94:100],会漏统计从第95次抛硬币开始的连续序列。
可选优化:概率计算逻辑优化
现有numberofstreaks/100的写法虽然结果正确(总试验次数为10000,等价于numberofstreaks/10000*100),但可读性较差,建议调整为更符合直觉的概率计算逻辑。
修复后完整代码(完全基于列表实现,符合学习要求)
import random numberofstreaks = 0 for experimentnumber in range(10000): result = [] for i in range(100): flip = random.randint(0,1) result.append(flip) # 修复遍历范围,覆盖所有可能的连续6次切片 for i in range(len(result)-5): # 修复判断逻辑,同时检测连续6次正面和反面 if result[i:i+6] == [0,0,0,0,0,0] or result[i:i+6] == [1,1,1,1,1,1]: numberofstreaks += 1 break print(numberofstreaks) # 优化概率计算,输出百分比格式更直观 print('Chance of streak:', round(numberofstreaks / 10000 * 100, 2), '%')
修复后代码运行得到的概率会在80%左右波动,符合理论预期,且无论连续相同结果的长度是6次、7次还是更多,都会被切片匹配到,完全符合试验成功的判定规则。
内容的提问来源于stack exchange,提问作者user2961444
相关产品推荐
相关产品推荐

