다음은 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로 변환됩니다.
덧붙여이 매핑은 또한 사용자가 가지고있는 수식을 증명합니다.
주사위와 알고리즘을 추가하기 위해 태그가 지정되었습니다. –