====== 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]