11 votes

Comment mettre en œuvre cette mécanique spécialisée de type "roll-and-keep" dans AnyDice ?

J'ai besoin d'aide avec une fonction de dés.

Je cherche un mécanisme modifié de type "Roll and Keep", où si vous avez plus de dés qui obtiennent le résultat maximum que vous n'en gardez, chaque résultat maximum écarté ajoute +1 au total.

Exemple : si vous lancez 6d10 et que vous en gardez deux (équivalent au 2 le plus élevé de 6d10 dans n'importe quel dé), et que vous obtenez 10, 10, 10, 8, 3 et 1, votre total sera de 21 - soit 20 pour les deux 10 que vous avez gardés, et +1 pour les 10 que vous n'avez pas pu garder.

Exemple 2 : si vous lancez 5d6 drop 2 (équivalent au plus haut 3 de 5d6 dans n'importe quel dé), et que vous obtenez 6, 6, 6, 6, 6 et 6, votre résultat sera 20.

Peut-être que je ne sais pas comment formuler correctement ce que je cherche, mais je n'ai pas pu trouver de réponse à cette question en faisant des recherches en ligne.

Merci d'avance.

10voto

Blckknght Points 6882

Voici une mise en œuvre de l'algorithme de Ben Barden. pour calculer les distributions que vous voulez.

function: N:n of SIZE:n keep K:n extras add {
    result: [helper NdSIZE SIZE K]
}

function: helper ROLL:s SIZE:n K:n {
    COUNT: [count SIZE in ROLL]
    if COUNT > K { result: K*SIZE - K + COUNT }
    result: {1..K}@ROLL
}

Le résultat est quelque peu décevant, puisque les points de bonus pour avoir beaucoup de valeurs maximales supplémentaires sur vos dés se produisent rarement. Il vous faut très de grands pools de dés par rapport au nombre de dés que vous gardez pour que la règle ait un effet notable. Voici un code qui calcule les distributions pour garder trois dés dans différents pools de d6. L'effet de la règle spéciale n'est vraiment important que pour les pools de dés qui sont plusieurs fois plus grands que le nombre de dés que vous gardez.

D: 6
K: 3

loop N over {K+1..K+8} {
  output [N of D keep K extras add] named "[N]d[D] keep [K] extras add +1"
}
loop N over {K+1..K+8} {
  output {1..K}@NdD named "[N]d[D] keep [K]"
}

graphs of statistical distributions

Votre règle spéciale n'affecte que la petite partie du graphique située sur la droite, où les lignes marquées d'un cercle divergent des lignes marquées d'un carré au-delà de 18 (le maximum normal pour 3d6). Pour les valeurs inférieures à 18 (qui représentent 95 % ou plus de la distribution pour la plupart des tailles de groupe), les deux types de lignes coïncident exactement.

7voto

trjh Points 11

Comme d'habitude, la réponse est d'écrire une fonction . Quelque chose comme ceci par exemple :

function: ROLL:s keep N:n plus one for each extra MAX:n {
  SUM: {1..N}@ROLL
  COUNT: ROLL = MAX
  result: SUM + [highest of 0 and COUNT - N]
}

output [highest 2 of 6d10] named "normal"
output [6d10 keep 2 plus one for each extra 10] named "with bonus"

Bien sûr, vous pourriez aussi raccourcir cela pour juste :

function: ROLL:s keep N:n plus one for each extra MAX:n {
  result: {1..N}@ROLL + [highest of 0 and (ROLL = MAX) - N]
}

mais je me suis dit que quelques variables nommées en plus ne nuiraient pas à la lisibilité.


Note : J'ai révisé mon code pour produire les mêmes résultats que La solution de Blckknght En effet, mon interprétation initiale (qui consistait à donner +1 pour chaque dé jeté correspondant au nombre le plus élevé effectivement obtenu, c'est-à-dire à omettre l'argument de l'égalité des chances) n'a pas été retenue. MAX paramètre et réglage MAX: 1@ROLL au lieu de) semble avoir été basé sur une mauvaise lecture de la question. (Pour ceux qui sont curieux, mon code original peut être trouvé dans le fichier histoire de l'édition de cette réponse). J'encourage tout le monde à voter en faveur de l'excellente réponse de Blckknght.

Dans tous les cas, si la logique que j'ai implémentée ci-dessus ne correspond pas exactement à ce que vous voulez, vous devriez pouvoir modifier le code assez facilement pour qu'il corresponde à votre mécanique actuelle. Notez que, à l'intérieur de la fonction, ROLL est simplement une séquence fixe de nombres (triés par ordre décroissant), de sorte que vous pouvez utiliser n'importe quelle syntaxe de manipulation de séquence dans AnyDice sur elle.

3voto

Ben Barden Points 24582

Vous devriez être en mesure de gérer cela avec un bloc conditionnel, parce que votre mécanisme de dicerolling se divise vraiment en deux options distinctes. Le psuedocode ressemblerait à ce qui suit

Roll 5d6

if (# of 6s) > = 3 {
   output 15 + (# of 6s)
}
else {
   output sum of top 3 dice
}
```

0voto

Crazed Geek Points 433

L'astuce est peut-être d'exploiter le casting de type d'Anydice dans les fonctions. Lorsque vous castez une variable DICE en tant que séquences ( DICE:s ), la fonction est évaluée pour chaque combinaison possible de DICE

https://anydice.com/program/23cf1

function: roll DICE:s keeping N:n {

  result: {1..N}@DICE + [highest of 0 and [count [maximum of 1@DICE] in DICE] - N]
}

output [roll 8d6 keeping 5] named "8d6 keeping 5"
output [roll 5d10 keeping 3] named "5d10 keeping 3"

roll results graph in anydice

AlleGamers.com

AlleGamers est une communauté de gamers qui cherche à élargir la connaissance des jeux vidéo.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X