8 votes

Faire en sorte que le dé le plus élevé soit relancé si un 1 est obtenu dans AnyDice.

Le système utilise une réserve de dés de d4 jusqu'à 3 dés (3d4 est le nombre maximum de dés que vous pouvez lancer). Si au moins un 4 sort de la réserve, c'est un succès. Si le chiffre le plus élevé est un 3, c'est un succès partiel. Si le plus haut chiffre est inférieur à 3, c'est un échec.

Output [count {3..4} in 3d4]

J'ai pu calculer cela facilement, mais voici la partie qui me bloque : Si vous avez un nombre quelconque de 1 dans votre réserve, le dé le plus élevé est relancé si c'est un 3 ou un 4. Le deuxième résultat est conservé. Exemples :

  • On lance 2d4 et on obtient 4, 1. Comme on a obtenu un 1, on relance le 4 et on garde le second résultat. On obtient un 3, ce qui signifie que le résultat est un succès partiel au lieu d'un succès.

  • Vous lancez 3d4 et obtenez 3, 1, 1. Comme il y a un 1, vous relancez le 3 et obtenez 4. Chanceux, vous avez obtenu un succès au lieu d'un partiel.

Comment puis-je coder cela dans AnyDice pour calculer avec précision les chances de réussite, de réussite partielle ou d'échec d'un joueur ?

12voto

trjh Points 11

Vous avez besoin d'une fonction, mais pas de boucles :)

Comme Someone_Evil note correctement la façon d'effectuer une inspection et une manipulation non triviale des résultats d'un jet de dés dans AnyDice est de passer ce jet dans une fonction qui attend une séquence (c'est-à-dire un paramètre étiqueté avec le symbole :s ). Lorsque vous faites cela, ce que AnyDice fait est d'appeler la fonction pour chaque résultat possible (trié) du rouleau et rassemble les résultats, pondérés par leur probabilité, dans un nouveau dé personnalisé.

À quoi doit ressembler votre fonction ? Quelque chose comme comme ceci (modulo une mauvaise lecture de la question ; voir la correction ci-dessous), par exemple :

function: test ROLL:s {
  if !(ROLL = 1) { result: 1@ROLL }
  result: [highest of d4 and 2@ROLL]
}

output [test 3d4]

OK, déballons un peu ça.

Tout d'abord, ROLL = 1 compare un nombre (1) avec une séquence ( ROLL ), renvoyant le nombre de valeurs de la séquence qui correspondent. Normalement, un if dans AnyDice traite 0 comme faux et tout ce qui est différent de zéro comme vrai, mais l'instruction ! annule cela, en transformant 0 en 1 et tout le reste en 0. Donc if !(ROLL = 1) exécute le bloc suivant uniquement si ROLL ne contient aucune personne.

À l'intérieur du bloc, nous retournons simplement le premier élément de la séquence ROLL . Nous savons que la séquence est triée par ordre décroissant (car c'est ce que fait AnyDice lorsque vous convertissez un dé en une séquence dans un appel de fonction), donc le premier élément est le plus élevé. Notez qu'AnyDice arrêtera l'exécution de la fonction dès qu'il verra une valeur result: donc la deuxième ligne de code de la fonction ne sera pas exécutée dans ce cas.

Si ROLL comprend certains d'entre eux, cependant, le !(ROLL = 1) sera fausse et le bloc suivant ne sera pas exécuté, donc AnyDice continue sur la deuxième ligne. Dans ce cas, nous retournons la plus haute valeur de d4 y 2@ROLL qui est la deuxième valeur la plus élevée obtenue à l'origine.

Pourquoi ceux-là ? Eh bien, imaginez ce que vous feriez en lançant les dés à la main. Vous les lancez d'abord tous, puis vous constatez que vous avez effectivement obtenu un 1. Maintenant, vous pouvez en toute sécurité mettre de côté tous les dés, sauf les deux plus élevés. car ils ne peuvent jamais être le résultat final. Ensuite, vous relancez le plus élevé des deux dés restants, et vous prenez le plus élevé des deux suivants.

Et c'est ce que fait le code.

(BTW, vous vous demandez peut-être ce qui se passe si vous appelez la fonction ci-dessus avec 1d4 de sorte que ROLL n'a qu'un seul élément. En fait, cela fonctionne toujours, mais seulement par une petite coïncidence. Ce qui se passe dans ce cas est que 2@ROLL évalue à 0, puisque c'est ce qu'AnyDice vous donne si vous demandez un élément au-delà de la fin d'une séquence. Et comme d4 est toujours supérieur à 0, la fonction finit par relancer le dé unique s'il est à l'origine un 1).


Correction : En écrivant la réponse ci-dessus, j'ai complètement oublié la dernière partie de la phrase "le dé le plus élevé est relancé". si c'est un 3 ou un 4 "Le code ci-dessus ne l'applique donc pas. Nous pouvons fixez-le facilement, cependant :

function: test ROLL:s {
  if !(ROLL = 1 & 1@ROLL = {3,4}) { result: 1@ROLL }
  result: [highest of d4 and 2@ROLL]
}

Cette version exécute le { result: 1@ROLL } à moins que le rouleau ne contienne des uns et le premier chiffre (c'est-à-dire le plus élevé) du rouleau est 3 ou 4.

( 1@ROLL = {3,4} est une traduction assez littérale de la règle "c'est un 3 ou un 4". Bien sûr, nous aurions pu l'écrire de manière euivalente, par exemple sous la forme suivante 1@ROLL >= 3 ou même - depuis qu'il a tout dans le rouleau 3 équivaut à ce que le nombre le plus élevé soit 3 - comme le montrent les chiffres suivants ROLL >= 3 . Nous no puede l'écrire comme ROLL = {3,4} Mais il s'agit d'une comparaison de séquence à séquence, qui fonctionne différemment).

5voto

Someone_Evil Points 42173

Vous avez besoin de fonctions et de boucles

Lorsque vous souhaitez effectuer des manipulations basées sur des lancers individuels dans un pool de dés, vous devez utiliser une fonction et convertir le lancer en une séquence. Cette dernière est réalisée en ajoutant :s sur la définition de la variable.

Nous pouvons alors faire quelques tours différents. Premièrement, les pools de dés lancés dans les séquences seront triés en fonction, donc s'il y a un 1, il sera en dernière position. On peut donc tester si c'est un 1 pour savoir s'il faut relancer. Anydice n'est pas fan de couper ou de faire des remplacements dans les séquences, donc nous devons faire une boucle pour construire une nouvelle séquence comme notre séquence résultante. (Vous pouvez le faire plus simplement en rendant la fonction plus simple si vous la construisez strictement pour saisir le plus haut et/ou pour ne travailler qu'avec un maximum de 3 dés. Cette version est plus générale).

function: poolroll A:s with B:n {
   if #A@A = 1 {
      D: {}
      loop N over {2..#A} {
          D: {D, N@A}
      }
      D: [sort {D, B}]
   } else {D: A}
   result: 1@D
}
output [poolroll 3d4 with 1d4]

Comme nous ne nous intéressons qu'au résultat le plus élevé, nous le prenons comme résultat. Nous obtenons ensuite la distribution des résultats, où 4 est un succès, 3 est partiel et 1 et 2 sont des échecs.

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