Voici le code que gd047 et Marek ont eu la gentillesse de fournir.
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)
Note: ceci est optimal dans le sens où il ne cherche pas à tout générer puis à rejeter les dupes. It actually generates only those that are required
.
Une explication des raisons pour lesquelles cela fonctionne:
Les numéros possibles sur les dés sont 1 à N.
Supposons que vous donne une combinaison possible du nombre de dés: x , x , ..., x S où S est le nombre de dés.
Puisque l'ordre n'a pas d'importance, on peut supposer que
x ≤ x ... ≤, ≤ x S.
Considérons maintenant la séquence x , x + 1, X + 2, ..., x S + S-1.
(par exemple: 1,1,1 devient 1,1 + 1,1 + 2 = 1,2,3).
Cette nouvelle séquence a des nombres de 1 à N + S-1 et tous les nombres sont distincts.
Cette correspondance entre votre séquence de dés et la nouvelle que nous avons créée est 1-1 et facilement réversible.
Ainsi, pour générer une combinaison possible de S avec les nombres 1 à N, tout ce que vous devez faire est de générer toutes les combinaisons S + S-1 S de S numéros de 1, 2, ..., N + S-1. Étant donné une telle combinaison, vous triez, soustrayez 0 du plus petit, 1 du second plus petit et ainsi de suite pour obtenir votre combinaison de dés pour les dés numérotés de 1 à N.
Par exemple, disons N = 6 et S = 3.
Vous générez un combo de 3 nombres de 1 à 6 + 3-1 = 8, soit 3 nombres de 1,2, ..., 8.
Disons que vous obtenez 3,6,7. Cela se traduit par 3, 6-1, 7-2 = 3,5,5.
Si vous avez 1,2,8. Cela se traduirait par 1,1,6. Par ailleurs, cette cartographie prouve également la formule que vous avez.
Réenregistré pour ajouter des dés et un algorithme. –