Les statistiques de « Card Strike » sur 888Poker

par Joseph Brennan
Article original

Introduction

Il y a plusieurs années, je suis tombé sur une fonctionnalité promotionnelle dans l’application 888Poker. Elle s’appelait Card Strike (abattage des cartes) et consistait essentiellement en un « jeu annexe » joué en même temps que les parties en argent réel. Les règles sont présentées dans cette vidéo courte et tape-à-l’œil, ainsi que sur ce site web, mais je vais également les énumérer ici.
◼
  • Lorsque vous « prenez place » à une table de jeu d’argent ordinaire ou à une table de jeu d’argent SNAP, 16 cartes aléatoires apparaissent en haut de votre écran. Je me référerai à ces cartes comme les cartes cibles.
  • ◼
  • Le poker SNAP est un format rapide dans lequel vous êtes assis à une nouvelle table et recevez une nouvelle main dès que vous vous couchez.
  • ◼
  • Une fois que vous avez reçu vos « cartes faces cachées », elles sont comparées aux cartes cibles et, si l’une d’elles correspond, alors la ou les cartes cibles appropriées sont « abattues ».
  • ◼
  • Il y a également une limite de main qui indique le nombre de mains qu’il vous reste pour « abattre » toutes les cartes cibles.
  • ◼
  • Vous pouvez réinitialiser vos cartes cibles et votre limite de main, en recommençant ainsi après que dix mains ont été jouées.
  • ◼
  • Si vous réussissez, on vous donne l’occasion de faire tourner une roue pour obtenir un prix en argent aléatoire déterminé par les enjeux du jeu d’argent. Il semble que le prix maximum soit de 10 000 $, mais il s’agit probablement déjà d’un jeu d’argent à « enjeux élevés ».
  • C’est assez simple ! Qui plus est, c’est entièrement gratuit et ne demande aucune compétence. Vous êtes à la merci probabiliste des cartes qui vous sont distribuées.
    J’ai pensé que cela était une bonne occasion d’explorer les statistiques de ce jeu, et peut‑être de tomber sur des résultats intéressants.
    ​De : https://www.888poker.com/poker-promotions/card-strike/

    Avertissement

    Les jeux d’argent impliquent un risque financier et peuvent créer une dépendance. Le contenu de cet article est fourni uniquement à des fins éducatives et analytiques et ne doit pas être interprété comme une incitation à jouer. Jouez toujours de manière responsable, fixez-vous des limites claires et demandez de l’aide si vous pensez avoir un problème d’addiction au jeu. Pour obtenir des conseils et un soutien confidentiels au Royaume-Uni, contactez GamCare à gamcare.org.uk ou appelez le 0808 8020 133.

    Une main à la fois

    Je commencerai par examiner les probabilités de tous les événements liés au Card Strike pour une main donnée de Texas Hold’em (également disponible pour Pot Limit Omaha, dont je ne parlerai pas ici).
    À chaque main, vous recevez 2 cartes faces cachées distinctes provenant d’un jeu de 52 cartes. Par conséquent, vous pourriez abattre 2, 1 ou 0 cartes cibles. Je vais écrire des fonctions pour chaque cas, en supposant k cartes cibles. Il me semble qu’au départ, k est égal à 16.
    In[]:=
    Clear[p0,p1,p2];​​p0[k_]:=
    Binomial[52-k,2]
    Binomial[52,2]
    ;​​p2[k_]:=Ifk>=2,
    Binomial[k,2]
    Binomial[52,2]
    ,0;​​p1[k_]:=1-p0[k]-p2[k];

    Matrice de transition

    Nous pouvons considérer le nombre de cartes cibles restantes comme notre « état ». La probabilité de passer à l’« état » suivant dépend uniquement de l’« état » actuel et non de l’historique de la manière dont nous y sommes parvenus. Cette configuration se prête à une matrice de transition de Markov.
    « Fait intéressant, les chaînes de Markov ont des liens historiques avec des processus tels que le mélange de cartes. Mon objectif est de montrer que ces outils et techniques mathématiques ne sont pas si effrayants, surtout si vous pouvez exploiter la puissance de Wolfram Language. »
    Pour 16 cartes cibles, il y a 17 états discrets possibles (de k = 16 à k = 0). Chaque fois que vous jouez une main, il existe une certaine probabilité de transition vers un nouvel état où k a diminué de 2, de 1, ou est resté identique.
    Il est utile de reformuler en termes du nombre de cartes effectivement abattues (ψ = 16 - k), qui peut aller de ψ = 0 à ψ = 16, puisque cela nous permet de « commencer » en haut à gauche de notre matrice et de progresser vers le bas et la droite à mesure que nous arrivons à la fin.
    Lors de la construction de notre matrice de transition P, nous utiliserons les règles suivantes :
    ◼
  • L’élément
    P
    ψ,ψ
    représente la probabilité d’obtenir 0 cartes cibles. Par exemple
    ψ
    00
    (
    ère
    1
    ligne,
    ère
    1
    colonne) représente la probabilité que ψ reste à 0.
  • ◼
  • L’élément
    P
    ψ,ψ+1
    représente la probabilité d’abattre exactement une carte cible. Par exemple,
    ψ
    01
    (
    ère
    1
    ligne,
    e
    2
    colonne) représente la probabilité que ψ passe de 0 à 1.
  • ◼
  • L’élément 
    P
    ψ,ψ+2
     représente la probabilité d’abattre 2 cartes cibles. Par exemple, 
    ψ
    02
     (
    ère
    1
    ligne,
    e
    3
    colonne) représente la probabilité que ψ passe de 0 à 2.
  • ◼
  • Toutes les autres entrées sont égales à 0, puisque vous ne pouvez pas abattre plus de 2 cartes par main, ni « désabattre » des cartes cibles.
  • Je vais créer cette matrice à l’aide de SparseArray et de Band, en définissant
    k
    0
    comme le nombre initial de cartes cibles.
    In[]:=
    k0=16;​​P=SparseArray[​​{​​Band[{1,1}]->Table[p0[k0-ψ],{ψ,0,k0}],​​Band[{1,2}]->Table[p1[k0-ψ],{ψ,0,k0-1}],​​Band[{1,3}]->Table[p2[k0-ψ],{ψ,0,k0-2}]​​},​​{k0+1,k0+1}​​];​​MatrixForm[P]
    Out[]//MatrixForm=
    105
    221
    96
    221
    20
    221
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    111
    221
    185
    442
    35
    442
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    703
    1326
    266
    663
    7
    102
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    19
    34
    13
    34
    1
    17
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    10
    17
    80
    221
    11
    221
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    410
    663
    451
    1326
    55
    1326
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    287
    442
    70
    221
    15
    442
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    301
    442
    129
    442
    6
    221
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    473
    663
    176
    663
    14
    663
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    165
    221
    105
    442
    7
    442
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    345
    442
    46
    221
    5
    442
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    1081
    1326
    235
    1326
    5
    663
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    188
    221
    32
    221
    1
    221
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    196
    221
    49
    442
    1
    442
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    1225
    1326
    50
    663
    1
    1326
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    25
    26
    1
    26
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    1
    Cette matrice est « triangulaire supérieure » puisque ψ peut seulement rester identique ou augmenter. L’élément en bas à droite vaut 1 puisque nous sommes assurés de ne plus abattre de cartes si toutes les cartes ont été abattues.
    Nous pouvons comparer certaines des lignes de cette matrice avec les calculs suivants en utilisant nos fonctions p0, p1 et p2 définies précédemment. Rappelez-vous que l’entrée de ces fonctions est le nombre de cartes cibles restantes :
    In[]:=
    Column[​​Map[​​#->Through[{p0,p1,p2}[#]]&,​​{16,15,10,2}​​]​​]
    Out[]=
    16
    105
    221
    ,
    96
    221
    ,
    20
    221
    
    15
    111
    221
    ,
    185
    442
    ,
    35
    442
    
    10
    287
    442
    ,
    70
    221
    ,
    15
    442
    
    2
    1225
    1326
    ,
    50
    663
    ,
    1
    1326
    
    Une manière agréable de visualiser cette matrice consiste à utiliser WeightedAdjacencyGraph, en remplaçant les valeurs nulles par un poids infini :
    In[]:=
    WeightedAdjacencyGraph[Normal[P]/.{0->Infinity},VertexLabels->Automatic]
    Out[]=

    Évolution de la matrice de transition

    Rappelez-vous que cette matrice représente les probabilités que j cartes cibles soient abattues, où j est l’indice de colonne, après exactement deux mains, étant donné que vous avez commencé avec i cartes cibles abattues (où i est l’indice de ligne).
    Déjà, nous avons des cas où il peut y avoir plusieurs façons de passer de l’état i à l’état j en deux étapes, auquel cas les probabilités de chaque manière sont additionnées.
    Vous comprenez l’idée. Nous pouvons maintenant utiliser cette propriété de l’« évolution via la multiplication matricielle » pour générer les probabilités de transition après n'importe quel nombre de mains !
    Je souhaiterais montrer la matrice des probabilités de transition après huit mains, pour une raison que vous pourrez peut-être deviner.
    C’est le plus petit nombre de mains dans lesquelles nous pourrions, en principe, abattre toutes les cartes cibles. Comme vous pouvez le voir, il est incroyablement faible, environ 836 000 fois moins probable que de gagner le jackpot de l’EuroMillions (à la date de rédaction).
    Ci‑dessous, je montre comment nous pourrions obtenir la même valeur numérique grâce à des « abattages » successives de deux cartes cibles :
    Nous pouvons tracer les probabilités d’abattre chaque nombre (de 0 à 16) de cartes cibles lorsque nous augmentons le nombre de mains jouées de 5 à 100.
    Observez comment la répartition se décale vers la droite.
    La limite de main, avant que les cartes cibles ne se réinitialisent et que vous ne recommenciez, est souvent citée comme étant de 45. Prêtons une attention particulière à ce tracé pour des mains comprises entre 40 et 60 :
    Nous pouvons voir que la probabilité atteint un maximum à 13, puis 14, puis 15 cartes cibles, lorsque 40, 50 puis 60 mains sont jouées. Cela prouve que la limite de 45 mains est choisie de manière très stratégique, de sorte qu’être proche d’abattre toutes les cartes cibles est le résultat le plus probable.
    Ci-dessous se trouve un tracé de la probabilité d’abattre les 16 cartes cibles en fonction du nombre de mains jouées :
    Il semble qu’il y ait approximativement 4 % de chance de réussite avec une limite de 45 mains.

    Processus de Markov

    Comme mentionné précédemment, ce processus possède une propriété d’« absence de mémoire » avec des états discrets ψ = 0, 1, 2, ..., etc..
    Cela signifie que nous pouvons utiliser la fonction DiscreteMarkovProcess.
    Le premier argument représente la loi de probabilité sur tous les états au temps 0. Comme nous partons d’un point où aucune carte cible n’a été abattue, il s’agit d’une liste contenant un 1 initial et les autres zéros.
    Maintenant, nous disposons d’un objet symbolique représentant ce processus, avec notre matrice de transition P.
    Nous pouvons visualiser le processus sous la forme d’un Graph, avec différents états (sommets) ayant des couleurs différentes, et les probabilités de transition peuvent être observées en survolant chaque arête.
    Une autre fonction très utile est MarkovProcessProperties, elle nous donne accès à une richesse d’informations sur notre processus :
    Par exemple, TransientTotalVisitMean qui est une mesure moyenne des visites aux états transitoires avant de finalement réussir.
    La fonction FirstPassageTimeDistribution a effectué pour nous le travail ardu d’algèbre linéaire, en élevant effectivement P à toutes les puissances possibles et en effectuant la somme sur tous les chemins possibles jusqu’à l’état final.
    Il s’agit d’un objet de distribution que nous pouvons interroger afin d’obtenir, par exemple, la fonction de densité de probabilité (PDF), la fonction de répartition (CDF) et d’autres propriétés.
    Déterminez la probabilité d’une réussite se produisant exactement à la huitième main (que nous avons vue plus tôt) :
    Nous pouvons même trouver la valeur attendue du nombre de mains nécessaires pour réussir à abattre toutes les cartes cibles :
    Et montrez que cela équivaut à prendre la Mean de la distribution :
    Nous pouvons même trouver la StandardDeviation :
    Ci-dessous se trouve un tracé du PDF, indiquant la probabilité d’achèvement exactement pour ce nombre de mains.
    La ligne de grille rouge indique la valeur modale des mains à 72, ce qui signifie que c’est la fenêtre la plus probable pour l’achèvement, puis elle commence à diminuer. Cela est dû au fait que la population de séquences qui n’ont pas encore abattue toutes les cartes cibles est en réalité en train de se réduire.
    Nous pouvons également créer un DiscretePlot de la CDF, incluant les quartiles Q1, Q2 et Q3 aux valeurs 65, 82 et 103 respectivement.
    Cela signifie que 50 % des achèvements réussis se produisent à la main 82.

    Quand réinitialiser ?

    Vous vous souvenez de la fonctionnalité qui vous permet de « réinitialiser » les cartes cibles dès que 10 mains ont été jouées ?
    Nous devrions intégrer cela dans notre exploration et essayer de déterminer précisément dans quels états nous devrions réinitialiser.
    En termes simples, nous devrions réinitialiser chaque fois que nous sommes dans un état où la probabilité de réussite est inférieure à la probabilité de réussite initiale.
    Il convient de mentionner que l’analyse suivante ignore effectivement les itérations futures et cherche à maximiser la probabilité de réussite pour l’itération actuelle. Une prise en compte adéquate de la « valeur attendue » (VA) peut permettre d’intégrer le « coût » lié au maintien d’états dont la probabilité de réussite est faible.
    Il est utile de partitionner la matrice P comme suit :
    La matrice Q représente des probabilités de transitions entre des états encore « en jeu » (transitoires), par exemple : 2 cartes cibles → 3 cartes cibles.
    La matrice R représente des probabilités de transitions des états transitoires vers des états de « succès », par exemple : 14 cartes cibles → 16 cartes cibles. Les états de « succès » sont généralement appelés états absorbants.
    La matrice I dans ce cas est l’identité 1x1.
    Pris isolément, R représente la probabilité de réussir dans exactement une main. C’est pourquoi les seules valeurs non nulles dans R sont les deux dernières, indiquant les probabilités d’obtenir deux cartes cibles à partir de l’état ψ = 14, et d’obtenir une carte cible à partir de l’état ψ = 15.
    Pour représenter les probabilités de réussite dans exactement deux mains, nous devons imaginer « ne pas réussir » sur la première main (en passant alors à un autre état, décrit par Q) puis réussir sur la deuxième main. Par conséquent, nous avons besoin du produit matriciel de Q et de R.
    Cette logique est encapsulée dans la fonction successWithinNHands :
    Mais pour cette section, nous nous intéressons à savoir quels états intermédiaires (après 10 mains) sont dignes d’une réinitialisation.
    Supposons que exactement 10 mains ont été jouées. Le tracé interactif créé à l’aide de ListAnimate précédemment nous indique que le résultat le plus probable est que 6 cartes cibles auront été abattues. Je souhaite examiner quels états sont dignes d’un réinitialisation, donc j’utiliserai la fonction successWithinNHands avec n = 45 - 10 = 35.
    En filtrant les probabilités qui sont inférieures à la probabilité initiale de réussite, nous pouvons trouver les états qui sont dignes d’une réinitialisation :
    La conclusion ici est que, si 10 mains se sont écoulées et que nous n’avons pas encore abattue au moins 6 cartes cibles, nous devrions appuyer sur le bouton de réinitialisation et recommencer !
    L’étape suivante consiste à répéter ce filtrage pour chaque nombre possible n de mains restantes, de n = 45 à n = 1.
    Je crée une matrice booléenne avec des 1 si l’état est réinitialisable, et des 0 s’il ne l’est pas, ou si moins de 10 mains ont été jouées.
    Je dois également prendre en compte des états qui sont « inaccessibles » dans le nombre de mains jouées. Par exemple, on ne peut pas abattre 12 cartes cibles après seulement 3 mains, puisqu’on ne peut abattre qu’un maximum de deux cartes cibles par main. J’assignerai -1 à ces états « inaccessibles ».
    Le MatrixPlot ci-dessus décrit quand nous devons « réinitialiser » (Reset) ou « continuer » (Continue) en fonction du nombre de mains restantes avant la limite de 45 mains, ainsi que du nombre de cartes cibles qui ont été abattues. J’ai également indiqué en noir les états inaccessibles. L’axe n diminue de gauche à droite pour représenter l’approche de la fin d’une itération, et l’axe ψ augmente lorsque l’on descend de haut en bas.
    Examinons un exemple, avec 25 mains restantes.
    Tout d’abord, nous obtenons les valeurs dans la matrice booléenne correspondant à n = 25 :
    Cela implique que nous devrions réinitialiser pour tout nombre de cartes cibles abattues ≤ 9. Si nous obtenons ensuite les probabilités en utilisant successWithinNHands, en sélectionnant celles qui sont inférieures à initProb, nous pouvons vérifier ce résultat.
    Ce résultat est assez contre-intuitif, et tout joueur humain serait très susceptible de « tenter sa chance », surtout étant donné que les cartes cibles se réinitialisent automatiquement si vous ne réussissez pas.

    Conclusion

    Cette exploration a été très agréable et n’a pris que très peu de temps à réaliser ! En modélisant le processus comme une chaîne de Markov, j’ai pu analyser des probabilités de transition, des distributions cumulées et des stratégies de réinitialisation optimales. J’espère que les enseignants pourront utiliser ceci comme ressource pour montrer comment des idées probabilistes abstraites peuvent être appliquées à des problèmes de décision concrets.
    Je dois également remercier Harrison Boon d’avoir suggéré certaines des méthodes d’enquête incluses dans ce travail.

    CITER CE NOTEBOOK

    Les statistiques de « Card Strike » sur 888Poker​
    par Joseph Brennan​
    Communauté Wolfram, CHOIX DE L’ÉQUIPE, 29 octobre 2025
    ​https://community.wolfram.com/groups/-/m/t/3567108