これは、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までです。
サイコロの数の可能な組み合わせが与えられたとします: x 1 , x 2 , ..., x Sここで S はサイコロの数です。
順序は関係ないので、次のように仮定できます。
x 1 ≤ x 2 ≤ ..., ≤ x S .
ここで、シーケンス 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 であり、簡単に元に戻すことができます。
したがって、1 から N までの数字を持つ S ダイスの可能な組み合わせを生成するには、すべての N+S-1 を生成するだけです。1、2、...、N+S-1 から S の数字の S の組み合わせを選択します。このような組み合わせが与えられた場合、それを並べ替え、最小のものから 0 を引き、2 番目に小さいものから 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 に変換されます。
ちなみに、このマッピングは、あなたが持っている式も証明しています。