我正在尝试模拟 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 函数本身有什么我不知道的吗?
return d7()*d2():您正在将两个随机数相乘。
6 可以通过两种方式制作:
5 可以通过 1 种方式制作:
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 |
| 归档时间: |
|
| 查看次数: |
68 次 |
| 最近记录: |