Outils pour utilisateurs

Outils du site


teaching:exos:poker_menteur

Poker menteur

Au poker menteur, on utilise 5 dés avec des valeurs de 1 à 6, ou 9, 10, valet, dame roi et as.

  • En lançant les 5 dés, on peut obtenir des combinaisons particulières classables dans un ordre conventionnel :
    1. rien
    2. une paire
    3. deux paires
    4. un brelan
    5. une petite suite
    6. une grande suite
    7. un full
    8. un carré
    9. une quinte ou poker
  • L'ordre de valeur de ces combinaisons est-il justifiable sur base de l'analyse combinatoire pour un seul lancer groupé des 5 dés ?
  • Examiner en fonction du nombre de lancers simulés la convergence des statistiques vers les probabilités en fonction du type de main.

Solution

Voici un programme permettant de simuler et traiter des lancers

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Poker menteur : lancers et mains possibles 
# 5 dés numérotés [1, 2, 3, 4, 5, 6]
#

import random

def lancer_de(nfaces = 6):
    # résultat lancer d'un seul dé
    try: return random.randint(1,nfaces)
    except: return 0

def lancer_des(ndes = 1, nfaces = 6):
    # résultat lancer de plusieurs dés. Sortie en liste triée.
    #try: return tuple(sorted([random.randint(1, nfaces) for i in range(ndes)])) # retourne un tuple
    try: return sorted([random.randint(1, nfaces) for i in range(ndes)]) # retourne une liste
    except: return ()

def main(lancer):
    # construit une liste triée par nombre d'occurrences croissant de 6 listes 
    # de 2 nombres : nombre d'occurrences et valeur de la face
    comptage = sorted([[lancer.count(valeur), valeur] for valeur in range(1,7)])
    #print comptage,  # décommenter pour visualiser comptage
    #
    # construit un tuple des nombres d'occurrences non nulles, par ordre croissant
    signature = tuple([nombre for nombre, valeur in comptage if nombre != 0])
    #print signature,  # décommenter pour visualiser signature
    main = mains[signature] # qualification correspondante de la main
    if main == "rien, petite ou grande suite":
        # l'analyse de la face manquante permet de déterminer la main
        if lancer[0]==2:
            main = "grande suite"
        elif lancer[4]==5:
            main = "petite suite"
        else:
            main = "rien"
    return main

# dictionnaire de correspondance pour les tuples des occurrences triées
t5=tuple([5])
mains = {
(1,1,1,1,1): "rien, petite ou grande suite", # 3 possibilités dans ce cas
(1,1,1,2): "une paire",
(1,2,2): "deux paires",
(1,1,3): "brelan",
(2,3): "full",
(1,4): "carre",
t5: "quinte (poker)"
}
    
n_essais=100  # procéder en faisant varier le nombre   
for i in range(n_essais):
    lancer= lancer_des(5,6)
    print lancer, main(lancer)

Et voici un autre programme permettant d'analyser de manière exhaustive tous les lancers possibles. Les parties répétées ne sont pas reprises.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# ...

lancers_possibles={}
histo_mains={}
for f1 in range(1,7): # pour toutes les faces possibles du dé 1
    for f2 in range(1,7): # pour toutes les faces possibles du dé 2
        for f3 in range(1,7): # pour toutes les faces possibles du dé 3
            for f4 in range(1,7): # pour toutes les faces possibles du dé 4
                for f5 in range(1,7): # pour toutes les faces possibles du dé 5
                    lancer= tuple(sorted([f1,f2,f3,f4,f5]))
                    #print lancer, main(lancer)
                    if lancers_possibles.has_key(lancer):
                        lancers_possibles[lancer][1]+=1
                        histo_mains[lancers_possibles[lancer][0]]+=1
                    else:
                        main2=main(lancer)
                        lancers_possibles[lancer]=[main2,1]
                        if histo_mains.has_key(main2):
                            histo_mains[main2]+=1
                        else:
                            histo_mains[main2]=1

for c,v in lancers_possibles.iteritems():
    print c,v

for c,v in histo_mains.iteritems():
    print c,v
print 'somme = ',sum(histo_mains.values())
print '6**5 = ',6**5

Pour la comparaison entre les probabilités issues de l'analyse exhaustive et des statistiques issues de simulations, utiliser les dictionnaires exhaustifs pré-créés et simplement ajouter au programme des nombres correspondants aux occurrences simulées.

Pour 7776 lancers, on obtient par exemple ceci pour la comparaison de l'analyse combinatoire et de la simulation :

quinte (poker) [6, 3]
rien [480, 466]
full [300, 299]
carre [150, 175]
deux paires [1800, 1855]
grande suite [120, 142]
brelan [1200, 1192]
une paire [3600, 3518]
petite suite [120, 126]

Pour 7 776 000 lancers, on a par exemple :

quinte (poker) [6, 5929]
rien [480, 480707]
full [300, 300304]
carre [150, 149591]
deux paires [1800, 1800461]
grande suite [120, 120194]
brelan [1200, 1200807]
une paire [3600, 3597522]
petite suite [120, 120485]
Ce site web utilise des cookies pour analyser le trafic de visites. En restant sur ce site, vous acceptez le stockage de cookies sur votre ordinateur. En savoir plus
teaching/exos/poker_menteur.txt · Dernière modification: 2013/11/12 13:38 par villersd