2010-05-23 5 views
5

주문이 중요 할 경우 가능한 모든 결과 행렬을 생성하는 것이 쉽습니다. 이를 수행하는 한 가지 방법은 here과 같이 expand.grid을 사용하는 것입니다.n 주사위 던지기에 대한 모든 가능한 결과 행렬 생성 (순서 무시)

그렇지 않은 경우 어떻게해야합니까?

제가 맞다면 가능한 조합의 수는 (S+N-1)!/S!(N-1)!입니다. 여기서 S는 주사위 개수이며 N은 1에서 N까지 N면이 있습니다. (이것은 잘 알려진 조합 공식과는 다르기 때문에 동일한 숫자가 두 개 이상의 주사위에 나타납니다). 예를 들어, 6 면체 주사위를 4 개 던질 때 N = 6과 S = 4이므로 가능한 조합의 수는 (4 + 6-1)!/4! (6-1)입니다! = 9!/4! x5! = 126. 이러한 126 가지 가능한 결과의 매트릭스를 어떻게 만들 수 있습니까?

감사합니다.

+0

주사위와 알고리즘을 추가하기 위해 태그가 지정되었습니다. –

답변

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.

작동하는 이유에 대한 설명 : X 은, × 2 : 당신은 주사위 숫자의 가능한 조합 주어진 가정 해 주사위에

가능한 번호 N.

1입니다, ..., x S 여기서 S는 주사위 개수입니다. 순서는 중요하지 않기 때문에

, 우리는 가정 할 수

X ≤ X ≤ ..., ≤ X S.

이제 시퀀스 X 1 고려 + 1 X 2, 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. 그러한 조합을 감안할 때, 가장 작은 것에서 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로 변환됩니다.

덧붙여이 매핑은 또한 사용자가 가지고있는 수식을 증명합니다.

+0

@Moron 맞아요!. 당신의 대답을 읽기 전에 코드가 없다는 것을 알았습니다. 의심의 여지가 처음 대답, 그래서 귀하의 답변에 코멘트로 내 코드를 추가 할 수 있습니다. S <- 6 N <- n <- (S + N-1, N) 결과를 선택하십시오 (combn (S + N-1, N), 2, 정렬) 적용) 행렬 (rep (c (0 : (N-1)), 각 = n), nrow = n) –

+0

@ gd047. 그래, 내 대답을 편집하여 코드를 추가했다. 필요하다고 생각되면 언제든지 답변을 편집하십시오. –

+1

이것은 매우 포괄적 인 대답입니다. 코드에 대한 한 가지 팁 :'combn'은 각 조합에 함수를 적용 할 수 있으므로'apply (combn (S + N-1, N), 2, sort)'는'combn (S + N-1, N, 정렬)'. – Marek

1

Generaly 당신이 원래 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 

두 번째 버전이 훨씬 빠릅니다.

+0

+1 매우 똑똑한 답변! – nico