Bra*_*ani 5 algorithm combinations r probability dice
在订单确实重要的情况下,生成所有可能结果的矩阵相当容易.这样做的一个方法是使用expand.grid如图所示这里.
如果没有怎么办?
如果我是对的,可能的组合的数量是(S+N-1)!/S!(N-1)!,其中S是骰子的数量,每个都具有编号为1到N的N个边.(它与众所周知的组合公式不同,因为可能出现相同的数字在不止一个骰子上).例如,当投掷四个六面骰子时,N = 6且S = 4,所以可能组合的数量是(4 + 6-1)!/ 4!(6-1)!= 9!/ 4!x5!= 126.如何生成这126种可能结果的矩阵?
谢谢.
小智 5
这是gd047和Marek提供的代码.
S <- 6
N <- 4
n <- choose(S+N-1,N)
outcomes <- t(combn(S+N-1,N,sort)) - matrix(rep(c(0:(N-1)),each=n),nrow=n)
Run Code Online (Sandbox Code Playgroud)
注意:这是最佳的,因为它不会尝试生成所有然后丢弃欺骗.It actually generates only those that are required.
解释它为什么起作用:
骰子上可能的数字是1到N.
假设你有一个骰子数的可能组合:x 1,x 2,...,x S其中S是骰子的数量.
由于订单无关紧要,我们可以假设
X 1 ≤X 2 ≤...,≤X 小号.
现在考虑序列x 1,x 2 + 1,x 3 + 2,...,x S + S-1.
(例如:1,1,1变为1,1 + 1,1 + 2 = 1,2,3).
这个新序列的数字从1到N + S-1,所有数字都是不同的.
从你的骰子序列到我们创建的新序列的映射是1-1并且很容易逆转.
因此,为了生成S骰子与数字1到N的可能组合,您需要做的就是生成所有N + S-1选择S编号从1,2,...,N + S-1的S组合.给定这样的组合,你可以对它进行排序,从最小的1减去0,从第二个减去1,依此类推,得到编号为1到N的S骰子的骰子数组合.
例如,假设N = 6且S = 3.
您生成1到6 + 3-1 = 8的3个数字的组合,即1,2,...,8中的3个数字.
假设你得到3,6,7.这转换为3,6-1,7-2 = 3,5,5.
如果你有1,2,8.这将转化为1,1,6.
顺便提一下,这种映射也证明了你的公式.