您是正确的,您在学生的直方图中观察到的 12 的数量高于滚动 12 的理论概率,但不是因为您认为的原因。
一个实验:
import random
def roll_dice(method):
if method == "choice":
return random.choice([1,2,3,4,5,6]) + random.choice([1,2,3,4,5,6])
else:
return random.randint(1,6) + random.randint(1,6)
def est_prob(n,k,method):
rolls = [roll_dice(method) for _ in range(k)]
return rolls.count(n)/k
def test12(n,k,method):
return sum(1 if est_prob(12,n,method) > 1/36 else 0 for _ in range(k))/k
请注意,test12(100,10000,"randint") 会根据randint 估计 100 个骰子的直方图掷骰子的概率过度表示 12 的总和。
典型运行:
>>> test12(100,10000,"randint")
0.5288
这大于 50%,具有统计学意义(10000 次试验是估计概率的相当大的试验次数)。
所以randint() 存在偏见的证据,不是吗?没那么快:
>>> test12(100,10000,"choice")
0.5342
使用random.choice(),您会看到同样的事情。这一切都不足为奇,因为大多数基于 100 次掷骰的掷骰子直方图高估了 12 次的概率。
当您掷一对骰子 100 次时,总和为 12 的预期掷骰数为 100/36 = 2.78。但是——你只能观察到整数个 12。观察到的 12 的数量为 3 或以上(因此导致直方图过度表示 12)的概率是 P(X >= 3) 其中 X 是参数 p = 1/36 和 n = 的二项式随机变量100. 这个概率可以计算为
P(X >= 3) = 1 - P(X<=2)
= 1 - P(0) - P(1) - P(2)
= 1 - 0.0598 - 0.1708 - 0.2416
= 0.5278
因此,大约 53% 的此类直方图具有“太多”的 12,这在 random.choice() 和 random.randint() 中都会看到。
您似乎在randint 的背景下注意到这种现象,将其解释为偏见(即使不是),并假设这是randint 的缺陷.