Pour les duplicatas exacts, le programme donné en Réponse de Carcer à la question que vous citez peut être facilement modifié pour prendre plusieurs pools de dés :
function: dupes in A:s B:s C:s {
DICE: [sort {A, B, C}]
DUPES: 0
loop X over {2..#DICE} {
if (X-1)@DICE = X@DICE { DUPES: DUPES + 1 }
}
result: DUPES
}
output [dupes in 1d12 2d10 1d8]
Notez que, comme le code original de Carcer, cette fonction retournera 3 pour (12, 12, 3, 3, 3, 1), et non 5, car elle compte un groupe de \$n\$ dés identiques à \$n-1\$ duplicata ! Si vous voulez compter tous les dés qui correspondent à au moins un autre dé, Voici une version qui permet de le faire :
function: dupes in A:s B:s C:s {
DICE: [sort {A, B, C}]
DUPES: 0
loop X over {1..#DICE} {
PREV_MATCH: X > 1 & (X-1)@DICE = X@DICE
NEXT_MATCH: X < #DICE & (X+1)@DICE = X@DICE
if PREV_MATCH | NEXT_MATCH { DUPES: DUPES + 1 }
}
result: DUPES
}
output [dupes in 1d12 2d10 1d8]
Notez que cette version ne donnera jamais un résultat de "un doublon" - il y en a toujours au moins deux, ou aucun !
Hélas, comme ces programmes doivent itérer à travers tous les résultats possibles de tous les lancers, ils peuvent être plutôt lents s'il y a beaucoup de dés avec beaucoup de faces dans le pool. Par exemple, les résultats de mes tests ci-dessus utilisent 1d12, 2d10 et 1d8, car essayer de les exécuter pour votre exemple de 3 d12, 2d10 et 1d8 fois. :/
Pour de plus grandes quantités de dés, mon rouleau de dés Python de une réponse antérieure peut faire l'affaire à la place. Voici une solution utilisant la méthode de comptage de Carcer :
from collections import defaultdict
summary = defaultdict(float)
for d12, p12 in dice_roll(12, count=3):
for d10, p10 in dice_roll(10, count=2):
for d8, p8 in dice_roll(8, count=1):
prob = p12 * p10 * p8
roll = sorted(d12 + d10 + d8)
dupes = sum(roll[i] == roll[i+1] for i in range(len(roll) - 1))
summary[dupes] += prob
for dupes, prob in sorted(summary.items()):
print("%d duplicates: %.2f%%" % (dupes, 100 * prob))
y en voici un qui utilise le vôtre :
from collections import defaultdict
summary = defaultdict(float)
for d12, p12 in dice_roll(12, count=3):
for d10, p10 in dice_roll(10, count=2):
for d8, p8 in dice_roll(8, count=1):
prob = p12 * p10 * p8
roll = sorted(d12 + d10 + d8)
dupes = sum(
(i > 0 and roll[i-1] == roll[i])
or (i < len(roll)-1 and roll[i+1] == roll[i])
for i in range(len(roll))
)
summary[dupes] += prob
for dupes, prob in sorted(summary.items()):
print("%d duplicates: %.2f%%" % (dupes, 100 * prob))
(Il s'agit également de solutions de force brute, mais Python est plus rapide qu'AnyDice. Et, si vous l'exécutez sur votre propre ordinateur, il n'a pas de limite de temps).
Tous ces programmes peuvent être assez facilement modifiés pour compter également les "quasi-accidents". Puisque vous avez maintenant divisé cette partie en une question séparée, J'y ai répondu .
0 votes
Il y a d'excellentes réponses ici, mais je dois noter que les résultats pour cette question sont légèrement étranges ; parce que les deux paires et les 2 paires sont beaucoup plus faciles à obtenir que le brelan, le 3 est un résultat moins probable que le 2 ou le 4.