====== Poker menteur ======
Au [[http://fr.wikipedia.org/wiki/Poker_menteur|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 :
- rien
- une paire
- deux paires
- un brelan
- une petite suite
- une grande suite
- un full
- un carré
- 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]