使用Python计算前100次掷骰子中连续出现3次6的概率
掷100次骰子出现连续3次6的概率优化方案
原方案问题分析
- 暴力枚举
6^100种情况完全不可行:该数值远超可观测宇宙的原子总数,永远不可能跑完所有循环 countConsecutive函数存在严重逻辑错误:判断条件漏写等号,且首次不匹配就直接返回False,根本无法检测数组中后续位置的连续6组合- 多层嵌套循环写法冗余,存在变量名重复、数组构造拼写错误等问题,运行也不可能得到正确结果
优化方案:动态规划法
我们可以通过状态动态规划实现O(n)时间复杂度、O(1)空间复杂度的计算,核心逻辑是跟踪每次掷骰子后末尾连续6的数量状态:
- 状态定义:用
dp0代表当前掷骰子后末尾0个连续6的概率,dp1代表末尾1个连续6的概率,dp2代表末尾2个连续6的概率 - 状态转移:
- 本次掷出非6时,末尾连续6的数量直接清零,对应新
dp0 - 本次掷出6时,末尾连续6的数量在上一轮基础上加1,对应新
dp1、dp2
- 本次掷出非6时,末尾连续6的数量直接清零,对应新
- 最终结果为
1 - dp0 - dp1 - dp2,即1减去掷完100次仍未出现连续3个6的概率
实现代码
# 初始化初始状态:还没掷骰子时,末尾0个连续6的概率为1 dp0, dp1, dp2 = 1.0, 0.0, 0.0 throw_count = 100 for _ in range(throw_count): new_dp0 = (dp0 + dp1 + dp2) * (5/6) new_dp1 = dp0 * (1/6) new_dp2 = dp1 * (1/6) dp0, dp1, dp2 = new_dp0, new_dp1, new_dp2 result = 1 - dp0 - dp1 - dp2 print(f"前100次掷骰子出现连续3次6的概率为:{result:.6f}")
运行后得到的结果约为0.930397。
内容的提问来源于stack exchange,提问作者supercar lover
相关产品推荐
相关产品推荐

