Toroid a expliqué comment corriger les erreurs dans votre code. Voici comment le simplifier et l'améliorer.
Le mot magique ici est récursivité . En fait, vous voulez écrire une fonction comme celle-ci :
function: damage on following turns {
result: (d20 < 19) * (4d8 + [damage on following turns])
}
Puis utilisez-le comme suit :
output 12d8 + [damage on following turns]
Aujourd'hui, si vous le faites Vous verrez une courbe à l'aspect étrange avec deux pics et un avertissement :
La profondeur maximale de la fonction a été dépassée, les résultats sont tronqués.
C'est une caractéristique délibérée d'AnyDice : la fonction que j'ai écrite s'appelle elle-même, et continuerait à le faire encore et encore si AnyDice ne la forçait pas à s'arrêter après (par défaut) 10 appels imbriqués. En gros, cela équivaut à forcer l'effet à se terminer après au plus 10 tours, que la cible réussisse sa sauvegarde ou non.
Il s'avère cependant qu'avec un DC de 19, la probabilité que la cible ne réussisse pas la sauvegarde en 10 tours est significative, ce qui signifie que la troncature modifie les résultats que nous obtenons. Heureusement, nous pouvons augmenter la limite en ajoutant quelque chose comme la ligne suivante avant la ligne de commande output
déclaration :
set "maximum function depth" to 20
Avec ce réglage nous voyons toujours un deuxième pic dans le graphique, mais il est beaucoup plus petit maintenant, et les dégâts moyens sont sensiblement plus élevés (169,30 CV au lieu de 159,51 CV).
Nous pouvons même modifier la profondeur de récursion maximale au cours du programme afin de représenter les résultats obtenus avec différents paramètres dans un seul graphique, comme par exemple ceci :
loop MAXDEPTH over {10, 20, 30, 40, 50} {
set "maximum function depth" to MAXDEPTH
output 12d8 + [damage on following turns] named "max [MAXDEPTH] turns"
}
Les graphiques résultants ressemble à ceci :
Ps. Mathématiquement, le nombre de tours jusqu'à ce qu'une sauvegarde soit réussie est de réparti géométriquement . Sa valeur moyenne est donc \$ \frac1p -1\$ donde \$p = \frac {21- \mathrm {DC}}{20}\$ est la probabilité de réussite de la sauvegarde. Pour un DC de 19, cela signifie que \$p = \frac {2}{20} = \frac {1}{10}\$ et donc le nombre moyen de tours jusqu'à ce qu'une sauvegarde réussisse est de \$ \frac1p - 1 = 10 - 1 = 9\$ .
Nous pouvons donc calculer les dégâts moyens exacts du sort comme étant les dégâts initiaux moyens ( \$12 \times 4.5 = 54\$ HP pour 12d8) plus les dégâts moyens par tour ( \$4 \times 4.5 = 18\$ HP pour 4d8) multiplié par le nombre moyen de tours jusqu'à la sauvegarde ( \$9\$ comme calculé ci-dessus), pour un total de \$54 + 9 \times 18 = 216\$ HP de dégâts en moyenne. Il s'agit du même nombre moyen qu'AnyDice retournera (approximativement) si vous augmentez la profondeur de récursion maximale à un nombre suffisamment grand (comme, par exemple, 99).
Bien sûr, il faut noter qu'une partie de ces dégâts moyens ne sera infligée qu'au cours d'un très grand nombre de tours, et seulement si la cible est malchanceuse et continue de rater ses sauvegardes (et a suffisamment de PV pour absorber tous ces dégâts). Si vous prévoyez par exemple d'utiliser ce sort dans un combat qui se terminera probablement en peu de tours, les valeurs de dégâts tronquées obtenues en utilisant une profondeur de récursion maximale plus faible peuvent en fait mieux refléter les attentes réalistes du jeu.