Python:random.randint与random.choice掷骰子结果差异原因问询
为什么用
random.randint(1,6)的学生直方图里12点频率异常高? 嘿,这个问题很有意思——其实锅不在random.randint(1,6)本身,大概率是学生写代码时犯了一个很容易忽略的逻辑错误:重复使用同一个随机数代表两个骰子的结果。
让我拆解一下:
首先,正确的逻辑应该是怎样的?
不管用randint还是choice,两个骰子的结果必须是独立生成的。比如:
# 用randint的正确写法 import random rolls = [] for _ in range(100): die1 = random.randint(1,6) die2 = random.randint(1,6) rolls.append(die1 + die2)
# 用choice的正确写法 import random rolls = [] for _ in range(100): die1 = random.choice([1,2,3,4,5,6]) die2 = random.choice([1,2,3,4,5,6]) rolls.append(die1 + die2)
这两种写法生成的结果分布是完全一致的,都符合两个6面骰子的概率规律(和为7的概率最高,12的概率最低)。
那错误出在哪?
如果学生图省事,只生成一次随机数就加两次,比如:
# 错误示例!千万别这么写 import random rolls = [] for _ in range(100): die = random.randint(1,6) rolls.append(die + die) # 两个骰子是同一个值!
这种情况下,两个骰子的结果完全绑定:当die=6时,和就是12,这个事件的概率是1/6(而正常两个独立骰子和为12的概率只有1/36),自然直方图里12点的频率会异常偏高。而且你仔细看的话,这类错误代码生成的和只能是偶数(2、4、6、8、10、12),其他奇数和根本不会出现。
为什么用random.choice的学生没踩这个坑?
可能是choice的调用形式更“约束”人——你每次都得写random.choice([1,2,3,4,5,6]),很难下意识地复用同一个变量;而randint(1,6)写法太简洁,容易让学生偷懒,不小心把同一个随机数变量加了两次。
总结一下:random.randint(1,6)和random.choice([1,2,3,4,5,6])在生成单骰子结果上是完全等价的,都是均匀分布。问题出在学生的代码逻辑,而非函数本身。
内容的提问来源于stack exchange,提问作者N. Duncan
相关产品推荐
相关产品推荐

