7 votes

Comment trouver le nombre le plus élevé obtenu dans un pool de dés, et le nombre de fois qu'il a été obtenu en utilisant AnyDice ?

Je suis en train d'apprendre les bases d'AnyDice, et j'ai vu qu'il était utilisé pour réaliser des algorithmes plutôt complexes. Je me heurte à un problème très rudimentaire.

Supposons que je veuille lancer un pool de cinq dés à dix faces, trouver la valeur maximale obtenue sur un seul dé du pool, puis compter le nombre de fois où cette même valeur apparaît dans le pool (Cela semble être une chose étrange à rechercher, mais c'est important dans le cadre d'un programme plus vaste que je veux écrire).

Par exemple, si j'obtenais les valeurs {1,4,8,9,9} lors d'un lancer particulier, le résultat serait 2 (la valeur maximale, 9, apparaît deux fois).

J'essaie d'y parvenir avec le bout de code suivant :

XROLL : 5d10

XMAX : [1 le plus élevé de XROLL].

sortie [compter XMAX dans XROLL]

Avec ces résultats :

0,59.049

1,32.805

2,7.29

3,0.81

4,0.045

5,0.001

Maintenant, le simple fait qu'un compte de zéro apparaisse dans les résultats suggère que quelque chose ne va pas. Je soupçonne que ce qui se passe est que le code prend un lancer particulier de 5d10 quand il calcule XMAX, puis lance à nouveau avant de trouver le compte de XMAX, ce qui introduit la possibilité que le XMAX trouvé dans le premier lancer n'apparaisse même pas dans le second.

Ce dont j'ai besoin, c'est d'un moyen de "geler" le jet et de le convertir en une séquence statique afin de pouvoir disséquer les valeurs spécifiques qu'il contient, et de ne pas relancer le jet chaque fois que je fais référence à XROLL. Quelqu'un peut-il confirmer qu'AnyDice relance effectivement les dés à chaque fois que j'invoque XROLL, et suggérer un moyen de contourner ce problème ?

Je m'excuse si la formulation n'est pas claire ou si je n'utilise pas la bonne terminologie.

6voto

trjh Points 11

Je soupçonne que ce qui se passe est que le code prend un lancer particulier de 5d10 quand il calcule XMAX, puis lance à nouveau avant de trouver le compte de XMAX, ce qui introduit la possibilité que le XMAX trouvé dans le premier lancer n'apparaisse même pas dans le second.

Oui, c'est exactement ce qui se passe. Fondamentalement, une variable "dé" dans AnyDice représente une certaine distribution de probabilité (sur des nombres, ou des séquences de nombres). Chaque fois que vous utilisez le dé dans une expression, AnyDice le traite comme une variable séparé, indépendant Roulez avec cette distribution.

Voici un programme simple pour démontrer ceci :

DIE: 1d6
output DIE - DIE named "you'd think this should be zero, but it's not..."

Si DIE représentait un nombre spécifique obtenu en utilisant 1d6 entonces DIE - DIE doit toujours être égal à zéro. Mais ce n'est pas le cas, comme l'exécution du programme ci-dessus le démontrera facilement.

En fait, ce qui se passe c'est que DIE voici juste un alias pour 1d6 donc DIE - DIE est la même chose que 1d6 - 1d6 c'est-à-dire (la répartition de) la différence entre deux produits distincts. 1d6 des rouleaux.

Ce dont j'ai besoin, c'est d'un moyen de "geler" le jet et de le convertir en une séquence statique afin de pouvoir disséquer les valeurs spécifiques qu'il contient et de ne pas relancer le jet chaque fois que je fais référence à XROLL. Quelqu'un peut-il confirmer qu'AnyDice relance effectivement les dés à chaque fois que j'invoque XROLL, et suggérer un moyen de contourner ce problème ?

Il existe, en effet, un moyen de "geler" un dé comme celui-ci : passer le dé à une fonction qui attend un nombre ou une séquence. Comme ceci :

function: test ROLL:n {
  result: ROLL - ROLL
}
output [test 1d6] named "this really is always zero"

Voici la citation pertinente de la documentation d'AnyDice ( accentuation mine) :

Types de paramètres

Les variables contenues dans le nom d'une fonction sont les paramètres sur lesquels elle opère. Il est possible de contraindre ces paramètres à un type spécifique. Pour ce faire, il suffit de faire suivre une variable de deux points, puis d'un caractère indiquant son type. Utilisez n pour les chiffres, d pour les dés, et s pour les séquences. Le comportement d'une fonction dépend du type de valeur qu'elle attend et du type de valeur qu'elle reçoit effectivement.

Attendre un nombre

Si une séquence est fournie, la séquence sera additionnée. Si un dé est fourni, la fonction sera invoquée pour tous les chiffres du dé - ou les sommes d'une collection de dés - et le résultat sera un nouveau dé.

S'attendre à un décès

Si un nombre est fourni, il sera converti en un dé qui ne peut obtenir que ce nombre. Si une séquence est fournie, elle sera additionnée et traitée de la même manière qu'un nombre.

Attente d'une séquence

Si un nombre est fourni, il sera converti en une séquence contenant uniquement ce nombre. Si les dés sont fournis, la fonction sera invoquée pour toutes les séquences possibles qui peuvent être faites en lançant ces dés. Dans ce cas, le résultat sera un nouveau dé.

Par exemple, voici comment compter le nombre de fois que le nombre le plus élevé apparaît dans un jeu de dés lancé :

function: count highest in ROLL:s {
  MAX: 1@ROLL
  result: ROLL = MAX
}
output [count highest in 5d10]

(Un peu d'explication sur le corps de fonction pourrait être utile. La syntaxe 1@ROLL donne la première valeur de la séquence ROLL Par défaut, AnyDice classe les lancers de dés dans l'ordre décroissant, ce sera donc le plus grand nombre obtenu. La comparaison ROLL = MAX puis compte combien de fois le nombre MAX se produit dans la séquence ROLL . Et oui, j'aurais pu simplement écrire result: ROLL = 1@ROLL mais ça aurait été encore plus énigmatique. De toute façon, tout est dans la documentation, sous "Séquences" et "Introspection").

5voto

Anders Eurenius Points 2976

Anydice fonctionne toujours avec des séquences de dés, il ne "lance" pas réellement quelque chose. Un d6 est en fait {1,2,3,4,5,6}. 2d4 sont {2,3,3,4,4,4,5,5,5,5,6,6,6,7,7,8} quand ils sont sortis (ils sont stockés comme des dés séparés avant cela). XMAX est une séquence avec beaucoup de 10 et une quantité décroissante d'autres nombres - chaque combinaison possible de 5d10 est considérée.

[count XMAX in XROLL] demande à anydice combien de fois chaque valeur de XMAX apparaît dans chaque ensemble de XROLL. Une valeur unique de la séquence XMAX, comme un 10, peut apparaître de 0 à 5 fois dans un jet de 5d10. Le plus souvent, cette valeur unique n'apparaîtra pas du tout dans le jet, d'où la prédominance des 0 dans la séquence finale.

C'est ce que montre votre résultat, qui n'est pas du tout ce que vous voulez. Sauf que c'est un peu le cas, du moins il s'en rapproche de manière inattendue. Ce que vous voulez découvrir, c'est la fréquence à laquelle les valeurs répétitives seront lancées - cela ne fait aucune différence pour les probabilités que ce soit des 1 ou des 10. Nous allons donc trouver la probabilité de lancer la même valeur que le premier dé sur 4d10. Cette ligne de code devrait le faire :

output 1+[count d10 in 4d10]

Dans celui-ci, d10 peut être remplacé par une valeur unique telle que 10, cela ne fera pas de différence. 1 est ajouté pour que le résultat corresponde à ce que votre question initiale demande, c'est-à-dire combien de dés avec les valeurs les plus élevées il y aura dans un lancer.

Cependant, il s'agit d'une valeur agrégée qui peut ne pas vous être très utile. Pour le décomposer en distributions individuelles pour chaque valeur maximale, nous devrons écrire un peu plus de code. Ce code a été écrit à l'origine par le dark wanderer, présenté ici avec quelques modifications.

output 1@5d10 named "Chances of a particular highest value on 5d10"
\iterate over all possible highest values, starting at 10\
loop MAX over {10,9,8,7,6,5,4,3,2,1}
{output [count MAX in 4dMAX]+1 named "Matches when highest value is [MAX]"}

( exécutez-le ici )

Puisque nous connaissons (en la fixant arbitrairement) la valeur la plus élevée de notre rouleau, MAX, tous les autres rouleaux seront 1..MAX. Tout ce que nous avons à faire est de compter le nombre de fois où MAX y apparaît.

Si vous voulez trouver la probabilité d'une combinaison spécifique de la valeur la plus élevée et du nombre de correspondances, vous pouvez simplement multiplier les deux probabilités pertinentes.

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