Python中randint函数模拟DnD骰子结果不符合预期问题排查
D14骰子模拟出现概率不均的原因及修复方案
问题分析
你的代码错误出在d14()的实现逻辑,和randint函数无关。你单独验证了d7和d2的均匀性没错,但两者相乘的方式并不能生成1-14的均匀分布,具体原因如下:
d7返回1-7的均匀随机数,d2返回1-2的均匀随机数,逐个拆解1-14每个数的生成路径:
- 奇数(1、3、5、7):只能通过
d7=奇数且d2=1得到,每个数仅1种组合 - 偶数中的2、4、6:有两种生成路径,比如2可以是
1*2或2*1,4可以是2*2或4*1,6可以是3*2或6*1,每个数对应2种组合 - 偶数中的8、10、12、14:只能通过
d7=4/5/6/7且d2=2得到,每个数仅1种组合
这就导致2、4、6的出现概率是其他数的两倍,和你观察到的模拟结果完全吻合。
修复方案
要生成1-14的均匀分布,需要重新设计d14的实现逻辑,让每个数对应唯一的(d7, d2)组合。比如:
def d14(): base = d7() return base if d2() == 1 else base + 7
或者更简洁的写法:
def d14(): return d7() + (d2()-1)*7
这样,当d2=1时返回1-7,d2=2时返回8-14,每个数都有且仅有一种生成方式,最终就能得到均匀分布的结果。
如果不需要依赖d7和d2的实现,直接用randint(1,14)是最简单的方式。
内容的提问来源于stack exchange,提问作者Lee Inbar
相关产品推荐
相关产品推荐

