teaching:exos:poker_menteur

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
teaching:exos:poker_menteur [2013/10/31 11:41] villersdteaching:exos:poker_menteur [2013/11/12 13:38] (Version actuelle) – [Poker menteur] villersd
Ligne 12: Ligne 12:
     - un carré     - un carré
     - une quinte ou poker     - une quinte ou poker
-  * Ces combinaisons sont-elles justifiables sur base de l'analyse combinatoire pour un seul lancer groupé des 5 dés ?+  * 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 
 + 
 +<sxh python; title : Poker_des_01.py> 
 +#!/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) 
 +</sxh> 
 + 
 +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. 
 + 
 +<sxh python; title : Poker_des_03.py> 
 +#!/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 
 +</sxh> 
 + 
 +<note tip>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.</note> 
 + 
 +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] 
 + 
  • teaching/exos/poker_menteur.1383216064.txt.gz
  • Dernière modification : 2013/10/31 11:41
  • de villersd