如何用Python复现R语言实现的掷骰子概率计算代码
3枚六面骰子点数和概率计算Python复现指引
问题说明
当前目标为使用Python复现《Bayesian Statistics The Fun Way》中的概率求解案例,待求解问题为:
投掷3枚六面骰子,点数总和大于7的概率为多少?
原书参考结果存在一处笔误:标注总共有218种可能结果,实际3枚六面骰子的有序排列总数为6*6*6=216种,其中点数和大于7的结果共181种的结论是正确的。
原书R实现参考
原书采用三层嵌套循环遍历所有骰子组合、逐组判断计数的逻辑实现计算,对应R代码如下:
count <- 0 for (roll1 in c(1:6){ for(roll2 in c(1:6){ for(roll3 in c(1:6){ count <- count + ifelse(roll1+roll2+roll3 > 7, 1, 0) } } }
Python实现思路提示
不需要刻意使用元组、集合等复杂数据结构,直接对齐原书的朴素实现逻辑拆解步骤即可,避免不必要的逻辑混乱:
- 首先初始化计数变量,初始值设为0,和R代码中
count <- 0的作用一致 - 三层遍历分别对应三枚骰子的点数:Python中生成1-6的整数序列可以用
range(1, 7),三层嵌套循环即可覆盖所有216种有序点数组合 - 逐组做条件判断:每遍历到一组三个点数,计算三者之和,若和大于7则给计数变量加1,对应R代码中
ifelse的判断计数逻辑 - 所有循环执行完成后,计数变量存储的就是满足点数和大于7的组合总数,除以总组合数216即可得到最终概率
补充说明:此前考虑的元组列表转集合的方案,本质是先全量存储所有组合再做统计,对于这个计算量级属于冗余操作,直接按遍历计数的逻辑写,和原书思路对齐,更不容易出错。
内容的提问来源于stack exchange,提问作者elksie5000
相关产品推荐
相关产品推荐

