5 votes

Quel est votre score moyen de PV en lançant 2 ou 4 dés après un premier lancer de 3322xx ?

King of Tokyo utilise un mécanisme de jet de dé similaire à celui de Yahtzee : vous avez droit à trois jets de dé et vous pouvez choisir de conserver ou de relancer un dé que vous aviez précédemment en main. À la fin du troisième lancer, vous devez conserver les faces du dé qui en résultent. Dans King of Tokyo, il y a trois faces numériques, '1', '2' et '3', et trois faces non numériques. Vous ne marquez des points de victoire (VP) que si vous obtenez un 3 ou plus, en marquant la face du dé et aucun point pour les faces non numériques ou les nombres avec des paires ou moins. Vous marquez d'abord la face du dé du brelan, puis 1 point supplémentaire pour chaque face correspondante. Par exemple :

-3 scores de '1' = 1 VP

-4 '1's score = 2 VP

-4 '2's score = 3 VP

-6 '3's score = 6 VP

-3 '3's et 3 '2's = 5 VP

Vous avez un jet initial de 3322xx, où 'x' n'est pas un chiffre. Supposons que pour votre troisième lancer, vous choisissiez toujours de lancer les dés qui entraîneront la plus grande augmentation moyenne de PV.

Quel est le nombre de PV moyen attendu après votre troisième lancer si vous choisissez de lancer 2 dés contre 4 dés pour votre deuxième lancer ? (Par exemple, est-il préférable d'obtenir un '22xx' ou un 'xx' si l'on veut marquer le plus de points en moyenne ?)

2voto

Pondidum Points 6541

Votre valeur attendue globale est celle à laquelle vous pourriez vous attendre : 3,1121.

En d'autres termes, vous devriez presque toujours obtenir votre jeu de 3 ou votre jeu de 4.

J'ai mis au point un simulateur pour vous aider. Maintenant, parce que je suis un lamer, j'ai utilisé Java. Il nécessite Java 7 car il utilise <> notation. Si vous utilisez une version plus ancienne, soyez prévenus. Voici le simulateur, tout d'abord. N'hésitez pas à le décortiquer pour ses fonctionnalités, mais pour ce qui est du style, je sais qu'il y a un million d'améliorations à apporter. C'est un script à jeter, si jamais il y en a un. Il peut y avoir des erreurs de copier/coller et autres, mais le code est en fait assez lisible. J'ajouterai des commentaires et modifierai si nécessaire, mais je regrouperai les modifications pour retarder la wikification de la communauté.

import java.util.*;
import java.text.*;
class Tokyo {
    // shortcut for iterating over the faces of a die roll
    static final int[] face = {0,0,0,1,2,3};

    public static void main(String...args) {
        // the initial roll - there's no control over this
        final Roll init = new Roll(3,3,2,2,0,0);

        // strat1: reroll all non 3s
        // this gets all possible results and their counts from 
        // using strat 1 as our guide. see rollStrat1 on the Roll class
        Map<Roll,Integer> strat1roll1 = init.rollStrat1();
        report(strat1roll1);
        // now, for each of those rolls, we need to simulate using the same
        // strategy - the addTo makes sure we give proper credit to rolls that
        // come up more often
        Map<Roll,Integer> strat1roll2 = new HashMap<>();
        for(Roll roll : strat1roll1.keySet()) { // for each roll from roll 1
            Map<Roll,Integer> curr = roll.rollStrat1(); // reroll according to the strat
            addTo(strat1roll2, curr); // and store them all in the master map
        }
        // now count the results
        report(strat1roll2);

        // strat2: reroll all non doubles - comments ommited because it's the same as above
        Map<Roll,Integer> strat2roll1 = init.rollStrat2();
        report(strat2roll1);

        Map<Roll,Integer> strat2roll2 = new HashMap<>();
        for(Roll roll : strat2roll1.keySet()) {
            Map<Roll,Integer> curr = roll.rollStrat2();
            addTo(strat2roll2, curr);
        }

        report(strat2roll2);

        // strat3: mix the two
        Map<Roll,Integer> strat3roll2 = new HashMap<>();
        for(Roll roll : strat2roll1.keySet()) {
            Map<Roll,Integer> curr = roll.rollStrat3();
            addTo(strat3roll2, curr);
        }
        report(strat3roll2);

    }

    static DecimalFormat df = new DecimalFormat("###.00000");
    static void report(Map<Roll,Integer> map) {
        int sum = 0;
        int count = 0;
        for(Roll roll : map.keySet()) {
            sum += roll.score() * map.get(roll);
            count += map.get(roll);
        }
        double exval = ((double)sum) / (double)count;
        System.out.println("total: " + sum);
        System.out.println("count: " + count);
        System.out.println("exval: " + df.format(exval)); 
    }

    // just merge the slave map into the master map
    static void addTo(Map<Roll,Integer> master, Map<Roll,Integer> slave) {
        for(Roll roll : slave.keySet()) {
            Integer count = master.get(roll);
            if(count == null) count = 0;
            master.put(roll, count + slave.get(roll));
        }
    }

    // reroll anything that isn't a 0 in the mask
    // if it is a non-0, that is the number that will show up in the roll
    // so if you want to re-roll a 2, in your strat method, turn that 2 into a
    // 0 so it gets re-rolled
    static Map<Roll,Integer> roll(Roll mask) {
        Map<Roll, Integer> rolls = new HashMap<>();
        // iterate over every possibly die roll
        for(int a = 0; a < 6; a++) { 
        for(int b = 0; b < 6; b++) { 
        for(int c = 0; c < 6; c++) { 
        for(int d = 0; d < 6; d++) {
        for(int e = 0; e < 6; e++) { 
        for(int f = 0; f < 6; f++) {

            int ra = mask.a == 0 ? face[a] : mask.a;
            int rb = mask.b == 0 ? face[b] : mask.b;
            int rc = mask.c == 0 ? face[c] : mask.c;
            int rd = mask.d == 0 ? face[d] : mask.d;
            int re = mask.e == 0 ? face[e] : mask.e;
            int rf = mask.f == 0 ? face[f] : mask.f;

            Roll roll = new Roll(ra, rb, rc, rd, re, rf);
            roll = roll.sort();
            if(rolls.containsKey(roll)) {
                rolls.put(roll, rolls.get(roll) + 1);
            } else {
                rolls.put(roll, 1);
            }
        }}}}}} // my code-review spidy sense is very pissed at me for this
        return rolls;
    }

    // unused, YAGNI I know... but this does illustrate all possible rolls
    static Map<Roll,Integer> possibleRolls() {
        return roll(new Roll(0,0,0,0,0,0));
    }

    // this represnts a roll, but it also represents a mask - lame, I know
    static class Roll {
        final int a,b,c,d,e,f; // the dice you have
        Roll(int a, int b, int c, int d, int e, int f) {
            this.a=a; this.b=b; this.c=c;
            this.d=d; this.e=e; this.f=f;
        }
        // welcome to Java - assumes they are properly sorted - a bad practice that
        // should be fixed if this grew beyond its current scope
        public boolean equals(Object o) {
            Roll ros = (Roll)o;
            Roll sor = this;
            return ros.a == sor.a && ros.b == sor.b && ros.c == sor.c 
                && ros.d == sor.d && ros.e == sor.e && ros.f == sor.f;
        }
        // order doesn't matter for the result, but this is a perfect hash, that's cool
        public int hashCode() {
            return (a+1) * (b+1) * (c+1) * (d+1) * (e+1) * (f+1);
        }

        Roll sort() { // delegate sorting to Arrays =)
            int[] p = {a,b,c,d,e,f};
            Arrays.sort(p);
            return new Roll(p[0],p[1],p[2],p[3],p[4],p[5]);
        }

        int[] counts() { // convenience method
            int[] counts = new int[4];
            counts[a]++; counts[b]++; counts[c]++;
            counts[d]++; counts[e]++; counts[f]++;
            return counts;
        }

        int score() {
            int[] counts = counts();

            // trust the math =), or don't and work it out for yourself =)
            return (counts[1] > 2 ? counts[1] - 2 : 0)
                 + (counts[2] > 2 ? counts[2] - 1 : 0)
                 + (counts[3] > 2 ? counts[3] : 0);
        }

        Map<Roll,Integer> rollStrat1() {
            return keepAll(3);
        }

        Map<Roll,Integer> keepAll(int k) {
        // reroll all non ks
            int ra = a == k ? k : 0; // the mask will have ks or 0s
            int rb = b == k ? k : 0;
            int rc = c == k ? k : 0;
            int rd = d == k ? k : 0;
            int re = e == k ? k : 0;
            int rf = f == k ? k : 0;
            return roll(new Roll(ra,rb,rc,rd,re,rf));
        }

        Map<Roll,Integer> rollStrat2() {
            // reroll anything that doesn't have 2x of something, except 0 - of course reroll 0s
            int[] counts = counts();
            int ra = counts[a] > 1 && a > 0 ? a : 0;
            int rb = counts[b] > 1 && b > 0 ? b : 0;
            int rc = counts[c] > 1 && c > 0 ? c : 0;
            int rd = counts[d] > 1 && d > 0 ? d : 0;
            int re = counts[e] > 1 && e > 0 ? e : 0;
            int rf = counts[f] > 1 && f > 0 ? f : 0;
            return roll(new Roll(ra,rb,rc,rd,re,rf));
        }

        Map<Roll,Integer> rollStrat3() {
            int[] counts = counts();
            if(counts[3] > 2 && counts[2] > 2) {
                Map<Roll,Integer> map = new HashMap<>();
                map.put(this,score());
                return map;
            }
            if(counts[3] > 2) {
                return keepAll(3);
            }
            if(counts[2] > 2) {
                return keepAll(2);
            }
            return rollStrat1();
        }
    }

}

Ce que sont les résultats lorsqu'il est exécuté est (ces valeurs ont changé - voir l'historique des modifications).

c:\files\j>java Tokyo
total: 81756
count: 46656
exval: 1.75231
total: 5081940
count: 1632960
exval: 3.11210
total: 73872
count: 46656
exval: 1.58333
total: 1283040
count: 466560
exval: 2.75000
total: 1165885
count: 419909
exval: 2.77652

Qu'est-ce que cela nous dit ? Eh bien, tout d'abord, il valide le système en donnant des valeurs presque identiques à celles calculées par d'autres méthodes pour le premier lancer. C'est une excellente nouvelle.

Maintenant, regardons les résultats réels. Le nombre de valeurs différentes explose pour la stratégie 1, principalement parce qu'elle relance 4 dés différents lors du premier passage, et probablement une moyenne de 3,5 environ pour le second passage. Le nombre semble beaucoup plus élevé à cause de l'unicité, mais j'ai ajusté ce "problème" dans le code.

La deuxième stratégie part de moins loin et peut être améliorée. Par exemple, si vous n'obtenez pas vos 2 la deuxième fois, ne serait-il pas préférable de jeter tous les 2 et d'aller chercher des 3 ? C'est là que j'applique la troisième stratégie.

Plutôt que de commencer avec les résultats de la strate 1, qui se concentrent uniquement sur les 3, j'utilise plutôt le premier jet de la strate 2 pour me concentrer sur l'acquisition de doubles. Ensuite, je change d'objectif : si j'ai les deux séries, haha, on a fini ici... merci... Si j'ai un jeu de 3 ou un jeu de 2, je le garde et je laisse tomber l'autre jeu : après tout, c'est idiot d'essayer d'avoir 1/6 de chance de ramasser l'autre jeu - j'ai beaucoup plus de chances de laisser tomber ces dés et de les mettre dans quelque chose qui porte déjà ses fruits. Enfin, si je n'ai pas de jeu, je lance par défaut tous les dés qui ne sont pas des 3, ce qui correspond à la "stratégie 1" originale et dont il est prouvé qu'elle donne un meilleur résultat que la stratégie 2. Et cela donne un excellent résultat, mais pas encore meilleur.

Notez les 5 rapports :

strat 1 roll 1
strat 1 roll 2

strat 2 roll 1
strat 2 roll 2

strat 3 roll 2 (its roll 1 is strat 2's roll 1)

Le résultat final est donc que dans ce scénario, jusqu'à présent, les stratégies indiquent que vous devriez simplement garder vos 3 et aller de l'avant.

2voto

Mike Stone Points 21293

Résumé

Vous devez garder les deux trois et renverser le reste. Votre score attendu est 2.81 (contre un score attendu de 2,64 pour avoir gardé les quatre dés).

J'ai calculé cela en utilisant un script sur mon téléphone, mais les valeurs semblaient ne pas correspondre à celles de tout le monde, alors je l'ai réécrit en python. Voici le version de python pour que tout le monde puisse la démonter.

Il prend beaucoup de temps pour s'exécuter (beaucoup plus longtemps que les version optimisée que j'ai écrit pour mon téléphone), donc voici le résultat .

Méthode

Si vous avez regardé le résultat, vous remarquerez que le script fait bien plus que répondre à cette seule question. Il calcule plutôt le meilleur coup pour n'importe quel jeu de dés, et avec n'importe quel nombre de lancers restants. Il commence par le cas simple de "aucun lancer restant" et incrémente le nombre de lancers. Cela lui permet de rechercher tous les ensembles possibles de dés conservés, et de calculer le meilleur score attendu pour chacun d'entre eux.

Jeu optimal

En prenant les meilleurs mouvements donnés par le script, j'ai pu trouver le jeu optimal pour n'importe quel état de jeu donné. Après le premier lancer, il est possible d'être dans l'une des 84 positions. Puisque nous traitons les griffes, les cœurs et les éclairs (4, 5 et 6) comme des X, vous avez plus de chances d'avoir lancé des X que des 2, par exemple. Les 84 positions sont indiquées ci-dessous :

What should be kept after first roll

L'image a été un peu réduite, mais si vous l'ouvrez dans un nouvel onglet ou si vous faites un zoom avant, elle est lisible. Chaque carré montre un jet particulier que vous avez pu obtenir, et met en évidence les dés que vous devez garder. J'ai codé les positions en couleur selon que vous devez garder les 1 (rouge), les 2 (vert) ou les 3 (bleu), une combinaison (jaune, cyan et magenta) ou aucun dé (gris). Le bas de chaque case indique votre score attendu.

Une fois que vous avez gardé une partie des dés et relancé le reste, vous vous retrouvez dans l'une des positions de la figure ci-dessous. Encore une fois, cette image montre quels dés vous devez garder et quel est votre score attendu.

What should be kept after second roll

Après avoir effectué le troisième roulement, vous vous retrouvez dans l'une des positions de la figure ci-dessous. Cette fois, le diagramme vous montre le score réel, et les couleurs correspondent aux dés qui vous rapportent des points.

Dice showing after the third roll, and the corresponding scores

Exemple

Voici un exemple d'utilisation des images ci-dessus. Imaginons que pour notre premier lancer, nous obtenions trois 1, deux 2 et un 3. Nous regardons dans la figure du haut et trouvons la partie qui ressemble à ceci :

enter image description here

Cela nous dit que notre meilleure chance est de garder les 2 et 3, et de relancer les 1. Notre score attendu est de 2,15. En relançant ces trois dés, nous obtenons deux 1 et une griffe (un X). Nous regardons la deuxième image du haut et trouvons la partie qui ressemble à ceci :

enter image description here

On nous dit que notre meilleure stratégie est maintenant de garder les 2 et de relancer le reste. Notre score attendu est tombé à 1,25. En relançant, nous obtenons deux autres 2, un autre 1 et un cœur (un X). Cela nous place dans cette case du troisième diagramme ci-dessus :

enter image description here

On marque 3 points pour une série de quatre 2.

Autres résultats

En jouant avec ce problème, j'ai trouvé plusieurs autres résultats intéressants.

Le score moyen attendu avec trois rouleaux restants est de 2,24. Il tombe à 1,34 si vous n'avez pas obtenu de 1, 2 ou 3 au premier lancer. Il tombe à 0,40 si vous n'avez toujours rien avec un seul jet restant.

La meilleure stratégie consiste généralement à garder un seul numéro et à relancer le reste, mais parfois vous devez garder plus d'un numéro (par exemple, pour (2,2,3,6,6,6) avec 2 lancers restants, vous devez garder (2,2,3)).

Si lors de votre premier lancer vous obtenez (1, 1, 1, 1, 3, 3), vous devez garder les 3 (score attendu de 2,81), mais si c'est votre deuxième lancer, vous devez garder les 1 (score attendu de 2,33).

1voto

Art Points 942

Examinons d'abord le relancement de seulement 2 dés. Puisque nous ne pouvons pas obtenir de PV avec des 1, nous voulons des 2 et des 3.

il y a 1/6 de chance pour l'un ou l'autre, donc les options que nous aimons sont :

  • 1/36 de 2,2, valant 3 points
  • 1/36 de 3,3, valant 4 points
  • 2/36 de 2,3, valant 5 points
  • 8/36 de 2,X, valant 2 points
  • 8/36 de 3,X, valant 3 points

pour une moyenne totale de 1,5833

relancer 4 dés est trop compliqué à faire à la main comme ça, donc j'ai écrit un petit script Python qui retourne une moyenne de 1.7523

donc, à moins d'évolutions ou d'objets spécifiques, relancez ces 2 !

EDIT
en supposant que nous relançons deux fois, comme demandé à l'origine.

si nous savons combien vaut chaque réserve de dés (en moyenne, avec une stratégie optimale) avant le dernier relancement, nous pouvons prendre une décision éclairée sur le premier relancement.

il est évident que nous voulons garder les 3. nous ne sommes pas sûrs pour les 2, mais nous gardons définitivement les 3.
donc, nous aurons certainement 2 3 dans le roulement final. quelles options sont meilleures à garder que 2 3 ?

  • Il est évident que toute autre paire ou tout autre nombre simple est pire que (3,3), tout comme 3 1 (à conserver avant le jet final en moyenne). (3,3,2,2,2) est meilleur que (3,3) ou (2,2,2).
  • (3,3) vaut en moyenne 1.7523
  • (1,1,1,1) vaut en moyenne 2.3333
  • (3,3,2,2,2) vaut en moyenne 2.6666
  • (2,2,2,2) vaut en moyenne 3.3333
  • (3,3,3) vaut en moyenne 3.5138
  • (3,3,3,1,1,1) a une valeur moyenne de 4
  • (3,3,3,2,2,2) vaut en moyenne 5 %.

Sachant cela, nous pouvons écrire un script qui testera toutes les possibilités si nous ne gardons que les 3 ou si nous gardons les deux, et qui utilisera la moyenne la plus élevée pour laquelle il se qualifie (si nous obtenons 3,3,2,2,2,2, nous utilisons 3,3333 comme valeur, bien que notre rouleau corresponde à d'autres options moins importantes).

En exécutant ce script, j'ai obtenu une valeur de 2,6834 pour ne garder que les 3 et 2,62024 pour garder les deux.
ils sont environ 1 de plus que le cas avec 1 reroll (tout à fait raisonnable), mais les chiffres sont inférieurs aux 3.1121 attendus par corsiKa, ce qui est inattendu.
Je vais approfondir la question, car j'adore King of Tokyo et les énigmes avec lesquelles je peux jouer et pas seulement les forcer.

peut fournir le code utilisé pour les calculs, si désiré

1voto

palaniraja Points 654

Si après le deuxième jet, vous avez 3322xx :

Relancer 4 dés

Chance qu'un 3 soit obtenu = 4C1 * 1/6 * 5/6 * 5/6 * 5/6 = 500/1296
Chance d'obtenir deux 3 = 4C2 * 1/6 * 1/6 * 5/6 * 5/6 = 150/1296
Chance d'obtenir trois 3 = 4C3 * 1/6 * 1/6 * 1/6 * 5/6 = 20/1296
Chance que quatre 3 soient obtenus = 4C4 * 1/6 * 1/6 * 1/6 * 1/6 = 1/1296
Chance que trois 1 soient obtenus = 4C1 * 1/6 * 1/6 * 1/6 * 4/6 = 16/1296
Chance que quatre 1 soient obtenus = 4C4 * 1/6 * 1/6 * 1/6 * 1/6 = 1/1296
Chance d'obtenir trois 1 et un 3 = 4C1 * 1/6 * 1/6 * 1/6 * 1/6 = 4/1296
Chance que trois 2 soient obtenus = 4C1 * 1/6 * 1/6 * 1/6 * 4/6 = 16/1296
Chance que quatre 2 soient obtenus = 4C4 * 1/6 * 1/6 * 1/6 * 1/6 = 1/1296
Chance d'obtenir trois 2 et un 3 = 4C1 * 1/6 * 1/6 * 1/6 * 1/6 = 4/1296
Chance d'obtenir zéro 3 = 1 - les probabilités ci-dessus = 583/1296

La moyenne attendue est la somme de toutes les probabilités multipliée par les PV que ce résultat rapporte :
(500 / 1296) * 3 = 1.157
(150 / 1296) * 4 = 0.463
(20 / 1296) * 5 = 0.077
(1 / 1296) * 6 = 0.005
(16 / 1296) * 1 = 0.012
(1 / 1296) * 2 = 0.001
(4 / 1296) * 4 = 0.012
(16 / 1296) * 2 = 0.025
(1 / 1296) * 3 = 0.002
(4 / 1296) * 5 = 0.015
(583 / 1296) * 0 = 0

La valeur attendue pour relancer 4 dés est de 1.157 + 0.463 + 0.077 + 0.005 + 0.012 + 0.001 + 0.012 + 0.025 + 0.002 + 0.015 = 1.769 VP

Relancer 2 dés

Chance de lancer deux 3 = 2C2 * 1/6 * 1/6 = 1/36
Chance de lancer un 3 = 2C1 * 1/6 * 4/6 = 8/36
Chance de lancer deux 2 = 2C2 * 1/6 * 1/6 = 1/36
Chance de lancer un 2 = 2C1 * 1/6 * 4/6 = 8/36
Chance d'obtenir un 3 et un 2 = 2C1 * 1/6 * 1/6 = 2/36
Chance de lancer zéro 2 ou 3 = 1 - probabilités ci-dessus = 16/36

La moyenne attendue est la somme de toutes les probabilités multipliée par les PV que ce résultat rapporte :
(1/36) * 4 = .111
(8/36) * 3 = .666
(1/36) * 3 = .083
(8/36) * 2 = .444
(2/36) * 5 = .278
(16/36) * 0 = 0

La valeur attendue pour relancer 2 dés est de .111 + .666 + .083 + .444 + .278 = 1.582VPs

Résumé : Lors de votre dernier relancement dans cette situation, relancez les 2. Relancer 2 dés donne une moyenne de 1,582 PV contre 1,769 PV pour relancer 4 dés.

Note : Cela ne fait que déterminer ce qui est le mieux pour le reroll final. Il ne calcule pas ce qui est le mieux si les deux relances sont disponibles.

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