4 votes

Dans AnyDice, comment puis-je calculer le nombre de succès du dé le plus élevé dans un groupe de dés donné ?

J'ai essayé le code suivant

output [count {5..6} in [highest 2 of 10d6]]

Ce qui donne

0: 99.90%
1:  0.10%

Toutefois, ces résultats ne sont pas plausibles. Dans un jeu de 10d6, la probabilité d'obtenir au moins un 6 ou un 5 devrait être extrêmement élevée, et on devrait au moins s'attendre à ce qu'il y en ait deux de temps en temps.


Je comprends maintenant qu'AnyDice essaye de trouver des 5 et des 6 dans les somme des deux premiers dés de la réserve, ce qui n'est pas ce que je souhaite. Je ne suis toujours pas près de trouver comment obtenir ce que je cherche.

5voto

A_S00 Points 11143

Comme vous l'avez deviné, la formule que vous utilisez vous donne le nombre de fois que le somme de [le 2 le plus élevé de 10d6] est 5 ou 6. Inutile de dire que cela est extrêmement rare, car en lançant 10 dés, vous obtiendrez presque toujours 2 jets suffisamment élevés pour obtenir un total de 7 ou plus.

Je ne connais pas de moyen élégant de faire en sorte que la fonction intégrée "highest" vous donne une valeur de séquence des dés les plus élevés, plutôt que les somme de ces dés les plus élevés... voici donc une solution totalement inélégant de la façon la plus efficace possible :

function: truncate A:n to two {
 if A > 2 { result: 2 }
 result: A
}

output [truncate ((d6 >= 5) + (d6 >= 5)+ (d6 >= 5)+ (d6 >= 5)+ (d6 >= 5)+ (d6 >= 5)+ (d6 >= 5)+ (d6 >= 5)+ (d6 >= 5)+ (d6 >= 5)) to two]

Essayez-le ici !

Il s'agit de :

  • Lance 1d6 dix fois, indépendamment les uns des autres.
  • Pour chacun d'entre eux, il vérifie si le résultat est supérieur ou égal à 5 (c'est-à-dire s'il s'agit d'un succès) et renvoie l'information suivante 1 si c'est un succès et 0 si ce n'est pas le cas.
  • Additionne les résultats (puisque nous renvoyons 1 en cas de succès et 0 en cas d'échec, la fonction somme des résultats est la même que celle de la compter de succès).
  • Fait passer la somme par une fonction définie par l'utilisateur qui arrondit le total à 2 s'il est supérieur à 2. Cela équivaut à prendre le meilleur 2 sur 10.

Je ne serais pas surpris s'il existait un moyen moins compliqué d'y parvenir, mais cette solution fait ce que vous voulez. Les résultats sont les suivants :

  • 1.73% probabilité de 0 succès
  • 8.67% chance de 1 succès
  • 89.60% chances de 2 succès

5voto

trjh Points 11

Comme A_S00 a déjà noté votre problème est que la fonction intégrée AnyDice [highest NUMBER of DICE] renvoie le somme des dés les plus élevés de la réserve.

En fait, dans les limites du modèle de données d'AnyDice, c'est tout ce qu'il faut faire. peut faire. AnyDice ne peut gérer que les types de variables suivants :

  • des entiers simples ("nombres"),
  • des listes finies d'entiers ("séquences"),
  • les distributions de probabilité sur des ensembles finis de nombres entiers (simples "dés"), et
  • des "pools" de deux ou plusieurs dés identiques ( !) ("collections de dés").

(En fait, AnyDice ne fait pas de différence réelle entre les deux derniers types énumérés ci-dessus ; un dé unique est traité exactement comme une collection d'un seul dé. Mais d'un point de vue conceptuel, il peut être utile de les distinguer).

Notamment, une variable AnyDice ne peut pas stocker une distribution de probabilités sur des séquences, ni une collection ou une séquence de plusieurs types de dés différents. Il n'y a donc aucun moyen pratique pour AnyDice de représenter, par exemple, "les deux nombres les plus élevés obtenus avec 10d6" sans l'intégrer d'une manière ou d'une autre dans l'un des types de dés pris en charge.

Bien sûr, il ne serait pas difficile d'écrire une fonction AnyDice qui prend une séquence et renvoie une autre séquence contenant les deux (ou n'importe quel nombre de) nombres les plus élevés qu'elle contient. En fait, en voici une, à titre d'exemple :

function: highest NUMBER:n of sequence SEQUENCE:s {
  SORTED: [sort SEQUENCE]  \ could be skipped if SEQUENCE known to be already sorted \
  R: {}
  loop P over {1..NUMBER} { R: {R, P@SORTED} }
  result: R
}

Et cela fonctionnera très bien tant que vous ne l'utiliserez que pour des séquences normales et non aléatoires. Par exemple, [highest 2 of sequence {3,2,1}] reviendra effectivement la séquence {3,2} . Mais si vous essayez de l'appliquer à une collection de dés, vous n'obtiendrez que l'image suivante somme des résultats les plus élevés, exactement les mêmes que ceux que vous obtiendriez à partir de l'outil intégré. [highest NUMBER of DICE] fonction.

Cela se produit parce que, chaque fois que vous essayez de passer une collection de dés à une fonction qui attend une séquence, AnyDice invoquera la fonction pour chaque résultat possible du lancer de dés, puis rassemblera les résultats dans un dé personnalisé (c'est-à-dire une distribution de probabilités) où la probabilité de chaque résultat est la probabilité totale de tous les lancers qui ont donné ce résultat. Mais comme je l'ai noté plus haut, AnyDice ne peut gérer que des distributions de probabilités à valeurs entières ; un dé dans AnyDice ne peut pas avoir une face étiquetée "{3, 2}". Ainsi, si l'un des résultats retournés par la fonction se trouve être une séquence plutôt qu'un simple nombre, AnyDice doit d'une manière ou d'une autre le transformer en nombre - et la manière dont il le fait, par défaut, est d'additionner les nombres de la séquence.


La norme et, en fait, la seule façon de contourner cette limitation est de faire ce que l'on veut avec la séquence de résultats. à l'intérieur la fonction avant de la renvoyer. Par exemple, comme ceci :

function: count VALUES:s in highest NUMBER:n of ROLL:s {
  R: {}
  loop P over {1..NUMBER} { R: {R, P@ROLL} }
  result: [count VALUES in R]  \ here, R is still a sequence \
}

output [count {5..6} in highest 2 of 10d6]

(Ici, je n'ai pas trié les ROLL puisque les séquences générées par AnyDice itérant sur les résultats possibles d'un lancer de dés sont garanties d'être déjà triées de toute façon).

Il est également assez facile de généraliser cette fonction pour permettre la sélection de tous les positions dans les rouleaux triés à compter, par exemple comme ceci :

function: count VALUES:s in positions POSITIONS:s of ROLL:s {
  R: {}
  loop P over POSITIONS { R: {R, P@ROLL} }
  result: [count VALUES in R]
}

output [count {5..6} in positions {1..2} of 10d6] named "count 5..6 in highest two of 10d6"
output [count {5..6} in positions {3..4} of 10d6] named "count 5..6 in 2nd highest two of 10d6"
output [count {5..6} in positions {5..6} of 10d6] named "count 5..6 in middle two of 10d6"
output [count {5..6} in positions {7..8} of 10d6] named "count 5..6 in 2nd lowest two of 10d6"
output [count {5..6} in positions {9..10} of 10d6] named "count 5..6 in lowest two of 10d6"

Addendum : Dans le cas particulier du comptage des dés qui roulent ci-dessus un seuil donné parmi les \$N\$ le plus élevé dans la piscine, il existe des moyens beaucoup plus simples d'obtenir le même résultat. L'idée clé est que, si vous lancez des dés au-dessus du seuil, ils seront toujours parmi les \$N\$ le plus élevé - à moins, bien sûr, que vous n'obteniez plus de \$N\$ dés au-dessus du seuil, auquel cas il en restera.

Ainsi, en particulier, les deux lignes suivantes produisent exactement le même résultat :

output [count {5..6} in highest 2 of 10d6]
output [lowest of 2 and [count {5..6} in 10d6]]

Bien entendu, il n'est pas nécessaire de limiter les résultats à 2 au maximum dans le code - vous pouvez tout aussi bien laisser AnyDice tracer l'ensemble de la distribution de [count {5..6} in 10d6] et regardez les deux premières colonnes.

En fait, vous pouvez également utiliser la fonction dernier deux colonnes du même graphique pour obtenir la distribution des 5 et des 6 parmi les le plus bas deux dés dans 10d6, et avec un peu d'attention, vous pouvez même faire la même chose pour les intervalles du milieu. Vous pouvez également vous contenter de laissez AnyDice faire le calcul pour vous :

function: middle of A:n and B:n and C:n {
  result: 2@[sort {A, B, C}]
}

output [middle of 0 and [count {5..6} in 10d6] - 0 and 2] named "count 5..6 in highest two of 10d6"
output [middle of 0 and [count {5..6} in 10d6] - 2 and 2] named "count 5..6 in 2nd highest two of 10d6"
output [middle of 0 and [count {5..6} in 10d6] - 4 and 2] named "count 5..6 in middle two of 10d6"
output [middle of 0 and [count {5..6} in 10d6] - 6 and 2] named "count 5..6 in 2nd lowest two of 10d6"
output [middle of 0 and [count {5..6} in 10d6] - 8 and 2] named "count 5..6 in lowest two of 10d6"

Pour une optimisation encore plus poussée, nous pourrions utiliser la fonction "astuce de réétiquetage" et faire un d6 personnalisé avec les faces 1-4 renumérotées à 0 et les faces 5-6 à 1. Cela évite à AnyDice d'avoir à itérer sur un grand nombre de jets différents mais équivalents, mais comme nous ne comptons plus que les faces renumérotées à 1, nous n'avons même pas besoin d'appeler une fonction explicite pour cela - laisser AnyDice additionner implicitement les résultats du jet est suffisant.

Grâce à cette optimisation, le code ci-dessus peut être écrit de manière équivalente comme ceci :

HIT: d6 >= 5  \ relabel sides 1..4 to 0 and 5..6 to 1 \

output [middle of 0 and 10dHIT - 0 and 2] named "count 5..6 in highest two of 10d6"
output [middle of 0 and 10dHIT - 2 and 2] named "count 5..6 in 2nd highest two of 10d6"
output [middle of 0 and 10dHIT - 4 and 2] named "count 5..6 in middle two of 10d6"
output [middle of 0 and 10dHIT - 6 and 2] named "count 5..6 in 2nd lowest two of 10d6"
output [middle of 0 and 10dHIT - 8 and 2] named "count 5..6 in lowest two of 10d6"

Bien sûr, ces deux astuces sont quelque peu limitées, puisqu'elles ne fonctionneraient pas (sans modifications appropriées) si nous voulions compter, disons, le nombre de un et de deux (ou même, disons, de un, de trois et de cinq) parmi les deux les plus élevés (ou les plus bas, ou ceux du milieu, etc.) de 10d6. Mais lorsqu'ils fonctionnent, ils peuvent être très utiles.

3voto

Dale M Points 183702

Pensez au problème et non au dé physique. Anydice n'est pas contraint d'utiliser de "vrais" dés.

Un succès se produit \$1 \over 3\$ Il ne faut donc pas un d6 mais un dé {0,0,1}.

Lancez ensuite ce dé :

output [highest 2 of 10d{0,0,1}]

et vous obtiendrez une probabilité de 0, 1, 2 succès.

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