这是 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)
注意:这是最佳的,因为它不会尝试生成所有内容然后丢弃重复内容。It actually generates only those that are required
.
其工作原理的解释:
骰子上可能的数字是 1 到 N。
Suppose you are given a possible combination of the dice numbers: x1 , x2 , ..., xS where S is the number of dice.
由于顺序并不重要,我们可以假设
x1 ≤ x2 ≤ ..., ≤ xS.
Now consider the sequence x1, x2 + 1, x3 + 2, ..., xS + 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,从 1、2、...、N+S-1 中选择 S 个数字的 S 个组合。给定这样的组合,你对其进行排序,从最小的减去 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。
顺便说一句,这个映射也证明了你的公式。