7

順序が重要な場合、考えられるすべての結果のマトリックスを生成するのはかなり簡単です。これを行う 1 つの方法は、ここexpand.gridに示すように使用することです。

そうでない場合はどうなりますか?

私が正しい場合、可能な組み合わせの数は です(S+N-1)!/S!(N-1)!。ここで、S はサイコロの数で、それぞれに 1 から N までの番号が付けられた N 個の面があります (同じ数字が現れる可能性があるため、よく知られている組み合わせの公式とは異なります)。複数のサイコロで)。例えば、六面体サイコロを4つ投げる場合、N=6、S=4なので、可能な組み合わせの数は(4+6-1)!/4!(6-1)!です。= 9!/4!x5! = 126. これら 126 の可能な結果のマトリックスを生成するにはどうすればよいですか?

ありがとうございました。

4

2 に答える 2

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)

注: これは、すべてを生成してから重複を破棄しようとしないという意味で最適です。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 に変換されます。

ちなみに、このマッピングは、あなたが持っている式も証明しています。

于 2010-05-23T20:07:00.767 に答える
1

一般的に、適用を使用して、expand.grid各結果を元の結果から順に並べる必要があります。unique

X <- expand.grid(1:6,1:6,1:6,1:6)
dim(unique(t(apply(X,1,sort))))
#[1] 126   4

ただし、順序付けされたすべての結果のサブセットを選択するのは難しい場合があります。

X <- expand.grid(1:6,1:6,1:6,1:6)
dim(subset(X, Var1>=Var2 & Var2>=Var3 & Var3>=Var4))
# [1] 126   4

2 番目のバージョンははるかに高速です。

于 2010-05-23T19:40:26.813 に答える