python中randint函数的意外结果

Lee*_*bar 2 python random

我正在尝试模拟 dnd 掷骰子以获得 1 到(对于本例)14 之间均匀分布的数字。

我的代码如下:

from random import randint

def r(n):
    return randint(1, n)
def d4():
    return r(4)
def d8():
    return r(8)
def d2():
    return d4()%2+1
def d7():
    res = d8()
    while res == 8:
        res = d8()
    return res
def d14():
    return d7()*d2()

# sim
from collections import Counter

res = Counter()
for i in range(100000):
    res[d14()] += 1


t = 0
for k in sorted(res.keys()):
    print(k, res[k])
    t += res[k]

print(t)
Run Code Online (Sandbox Code Playgroud)

我分别检查了 d2 和 d7,它们似乎工作正常。

模拟部分只是检查每个结果是否均等可能,但输出似乎关闭。

1 7185
2 14260
3 7220
4 14276
5 7239
6 14349
7 7171
8 6992
10 7078
12 7124
14 7106
100000
Run Code Online (Sandbox Code Playgroud)

这就是这次输出的内容。似乎 2、4 和 6 出现的可能性是其他任何选项的两倍。有时它会在我不更改代码的情况下发生变化,但这是预期的,因为它应该是随机的,但总有一些数字出现的可能性是两倍,而且它们总是偶数。我已经计算过了,希望是正确的,但这显然不应该发生。

我的代码是否错误,或者 randint 函数本身有什么我不知道的吗?

The*_*nnu 7

return d7()*d2():您正在将两个随机数相乘。

6 可以通过两种方式制作:

  • 1*6
  • 2*3

5 可以通过 1 种方式制作:

  • 1*5

ETC。

但9、11、13是无法制造的。

因此,选择 2、4 和 6 的可能性是 1、3、5、7、10、12 和 14 的两倍,而不能选择 9、11 和 13。

编号 制作方法
1 1*1
2 1*2;2*1
3 1*3
4 1*4;2*2
5 1*5
6 1*6;2*3
7 1*7
8 2*4
9
10 2*5
11
12 2*6
13
14 2*7