5 votes

AnyDice : Comment calculer le gagnant dans des jets opposés sur plusieurs tours ?

J'ai quelques difficultés à faire des jets opposés sur plusieurs rounds.

Je suis à la recherche d'une statistique personnage contre personnage. Je les appelle respectivement "Rookie" et "Enemy". Je veux savoir quelles sont les chances que le Rookie gagne contre l'Ennemi sur un nombre X de tours. J'essaie de voir comment les modificateurs affectent deux personnages qui se battent l'un contre l'autre pendant de nombreux tours de jeu.

Exemple :

  • Rookie Rolls 1d20+0
  • Roulements ennemis 1d20+2
  • Si Rookie > Ennemi, Succès de Rookie
  • Si Rookie < Ennemi, Perte de Rookie
  • Si Rookie = Ennemi, Egalité - Doit avoir un succès ou une défaite, donc relancer le dé.
  • Les 3 meilleurs tours sur 5 constituent un ensemble.
  • Si la recrue obtient 3 succès, elle gagne la manche.
  • Si l'ennemi obtient 3 succès, la recrue perd le set.
  • Il n'est pas nécessaire qu'ils soient consécutifs

Je veux savoir quelles sont les chances de succès de la recrue qui gagne un set de 3 sur 5. J'ai fini par effectuer un forçage brutal en C# avec 1 million de lancers - sans erreur, je vois la recrue gagner des séries d'environ 1,5 million d'exemplaires. 28.8% 31,8 % du temps.

Des idées ? Merci !

Lien vers le code AnyDice

X: 5
MODFORROOKIE: 0
MODFORENEMY: 2

output 1d20+MODFORROOKIE > 1d20+MODFORENEMY named "d20: Rookies Success in 1 Round"
output 1d20+MODFORROOKIE = 1d20+MODFORENEMY named "d20: Rookies Tie in 1 Round"
output [count 1d20+MODFORROOKIE > 1d20+MODFORENEMY in Xd20] named "d20: Rookies # of Successes in X Rounds"
output [count 1d20+MODFORROOKIE = 1d20+MODFORENEMY in Xd20] named "d20: Rookies # of Ties in X Rounds"

0 votes

Je ne suis pas sûr de comprendre les mécanismes de l'action que vous essayez d'analyser. Si l'un ou l'autre des joueurs gagne lors d'un premier tour, s'arrête-t-on et ne joue-t-on pas d'autres tours ? Est-ce que seules les égalités conduisent à jouer d'autres tours (ou est-ce que "reroll" signifie quelque chose de différent) ?

0 votes

C'est déroutant. Voulez-vous connaître la probabilité que, par exemple, la recrue gagne 1 round sur X, 2 sur X, ..., X rounds sur X, ou voulez-vous connaître la probabilité que la recrue gagne 1 round, 2 rounds d'affilée, 3 rounds d'affilée, ..., X rounds d'affilée ?

3 votes

Soit dit en passant, les deux sont faciles à calculer par le biais d'une distribution géométrique ou d'une distribution binomiale. Vous n'avez pas besoin de simuler quoi que ce soit sur AnyDice pour cela.

3voto

Vyral Points 11

Une solution analytique à ce système se présente en trois parties.

Tout d'abord, pour une seule série de jets opposés, quelles sont les probabilités de victoire, de défaite ou d'égalité pour la Recrue ? Vous pouvez le faire par force brute en comptant les résultats de tous les jets d'opposition. \$20 \times 20 = 400\$ possibilités. Cependant, vous pouvez rationaliser cela avec des probabilités conditionnelles, donc par exemple $$ P(win \space rouleau)= \sum_ {R_i}P(R_i) \times P(win,R_i) $$ \$ P(R_i) \$ est la probabilité de n'importe quel jet individuel par la recrue et est toujours \$ \frac 1 {20} \$ . \$P(win,R_i)\$ est la probabilité que le Rookie gagne s'il a obtenu le résultat suivant \$R_i\$ . Donc si \$R_i = 1\$ Le bleu ne peut pas gagner et \P(win,1)=0 \$ . Si \$R_i=20\$ La recrue gagnera si l'ennemi obtient un résultat inférieur à 18 (ce qui donne une égalité) et si \$P(win,20)= \frac {1}{17} \$ . Procédez à ce raisonnement pour toutes les valeurs de \$R_i\$ et effectuez la somme ci-dessus et vous obtenez \$P(win \space roll) = 0,3825\$ .

Un raisonnement similaire donnera \$P(tie \space roll) = 0,045\$ y \$P(lose \space roll) = 0,5725\$ .

Deuxièmement, puisque les égalités déclenchent une relance, nous devons calculer la probabilité d'une victoire, éventuellement après une série d'égalités. Appelons cette séquence de lancers un test. La probabilité de gagner un test est la probabilité de gagner au premier lancer, plus la probabilité d'égaliser le premier lancer et de gagner le deuxième, plus la probabilité d'égaliser les deux premiers et de gagner le troisième, etc. $$ P(win \space test) = P(w \space r) + P(t \space r) \times P(w \space r) + P(t \space r)^2 \times P(w \space r) + ... $$ ou $$ P(win \space test)= \sum_ {n=0}^{ \infty }P(win \space rouleau) \times P(lien \space rouleau)^n $$ Il s'agit d'un séries géométriques infinies qui se simplifie en $$ P(win \space test)= \frac {P(win \space roll)}{1 - P(tie \space roll)} = 0.400524 $$

Enfin, nous avons besoin de la probabilité de gagner suffisamment de fois sur un groupe d'essais. Appelons cela un match. Vous avez spécifié qu'il s'agit d'un match au meilleur des cinq, alors regardons cela. $$ P(win \space match) = P(3w,5t) + P(4w,5t) + P(5w,5t) $$ Les probabilités individuelles sont juste données par la distribution binomiale : la probabilité de \$k\$ gagne sur \$n\$ Les essais sont $$ P(k,n) = \frac {n!}{k !(n-k)!} \times P(win \space essai)^k \times (1 - P(win \space procès))^{n-k} $$ Entrez les chiffres, et vous obtenez \$P(win \space match) = 0,318345\$.

Elle doit pouvoir s'adapter à toute une série de concours différents. Il suffit de modifier les chiffres à l'étape appropriée du calcul.

Je ne comprends pas pourquoi il y a une différence entre votre simulation et ce résultat. Je suis assez sûr de mes calculs, car j'ai effectué un certain nombre de vérifications en cours de route. Je note qu'un nombre fixe de lancers ne donne pas un nombre fixe d'essais. Il y aura un nombre moyen d'essais, mais si ceux-ci n'ont pas été comptés correctement, cela pourrait fausser votre calcul.

0 votes

Hé MacA, c'est une réponse bien écrite - merci ! En fait, j'avais un bug dans ma force brute après qu'une autre paire d'yeux l'ait examinée. Je ne gérais pas les égalités correctement. En refaisant 1 million d'essais, j'obtiens une réponse très similaire à la tienne. (0.318743)

1voto

trjh Points 11

Bien sûr, il y a un moyen de faire ça dans AnyDice, aussi.

Tout d'abord, nous avons besoin de quelques fonctions d'aide qui ne sont malheureusement pas encore intégrées par défaut dans AnyDice. Celle-ci est utile pour déterminer si un jet opposé est une victoire, une défaite ou une égalité :

function: sign of NUMBER:n {
  if NUMBER > 0 { result: +1 }
  if NUMBER < 0 { result: -1 }
  result: 0
}

Nous pouvons l'utiliser par exemple comme ceci :

ROOKIE: d20 + 0
ENEMY: d20 + 2

WINNER: [sign of ROOKIE - ENEMY] 
output WINNER named "single round: +1 = Rookie win, -1 = Enemy win, 0 = tie"

Ensuite, nous avons besoin d'une fonction pour relancer les égalités, quelque chose comme celui de cette réponse :

function: restrict ROLL:n to RANGE:s {
  if ROLL = RANGE { result: ROLL }
  else { result: d{} }
}

Nous pouvons l'utiliser comme ceci pour obtenir la probabilité que la recrue gagne, après que les égalités aient été résolues :

ROUND: [restrict WINNER to {+1,-1}] = +1
output ROUND named "single round with rerolls: 1 = Rookie win, 0 = Enemy win"

Et enfin, nous pouvons prendre le dé biaisé ROUND qui obtient 1 avec la probabilité que la recrue gagne un seul tour et 0 sinon, et trace simplement le résultat de cinq lancers :

output 5dROUND named "number of Rookie wins over 5 rounds"

Nous pouvons alors lire le résultat directement à partir de cette sortie, du moins après avoir cliqué sur le bouton "At Least" :

Screenshot

Ou, si vous préférez, vous pouvez directement comparer le nombre de victoires de Rookie par rapport à 3 et sortir ce chiffre à la place :

output 5dROUND >= 3 named "probability of Rookie winning at least 3 rounds out of 5"

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