如何模拟 N 个模辊的每个面的频率?

机器算法验证 可能性 骰子
2022-03-31 11:35:17

我想在不实际掷骰子的情况下模拟 N 次公平掷骰子。需要明确的是,我想实现这样的目标:

N = 1000
"1" showed up 185 times
"2" showed up 162 times
"3" showed up 158 times
"4" showed up 148 times
"5" showed up 182 times
"6" showed up 165 times

我可以说,例如,数字 1 出现了

random_binomial_distribution(N = 1000, probability = (1/6))

次。但我不能将它应用于所有面孔,因为所有这些结果的总和可能不等于 1000。


如何在不遍历每一卷的情况下模拟 N 卷每个面的频率?

2个回答

不同面孔的频率不是独立的,因为它们必须总和为但是,您可以迭代面数,而不是迭代骰子,这不会随着增加:NN

  1. 的出现模拟为二项式,进行次试验,成功概率n1N1/6
  2. 模拟 2,的出现,作为二项式,具有次试验和成功概率n2Nn11/5
  3. 模拟 3,的出现,作为二项式,具有试验和成功概率n3Nn1n21/4

依此类推,直到您以成功概率模拟 6 的出现1,用完所有剩余的卷。

我觉得最简单的死法D双方(你的问题假设D=6),具有任意一组值(您的问题假设掷骰子是其中之一1,2,3,4,5,6) 是对骰子的一组值使用基于洗牌算法的采样函数:

Python

假设您有一个名为 的骰子值数组(任意数量的值,任意一组值),MyDie“滚动”MyDie N时间的基础是:

import random
values, counts = np.unique(random.choices(MyDie,k=10), return_counts=True)

例如,对于N=10

>>> import random
>>> import numpy as np
>>> values, counts = np.unique(random.choices(MyDie,k=10),return_counts=True)
>>> print(values,"\n",counts,sep="")
[1 2 3 4 5 6]
[1 4 1 1 1 2]

R

假设您有一个名为 的骰子值数组(任意数量的值,任意一组值),MyDie“滚动”MyDie N时间的基础是:

sample(MyDie,size=N,replace=TRUE)

例如,对于N=10

> MyDie <- 1:6
> table(sample(MyDie,size=10,replace=TRUE))

1 2 3 5 6 
4 1 2 1 2