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
Dernière révisionLes deux révisions suivantes
teaching:exos:poker_menteur [2013/10/31 11:41] villersdteaching:exos:poker_menteur [2013/11/03 10:22] villersd
Ligne 13: Ligne 13:
     - 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 ?   * Ces combinaisons sont-elles justifiables 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.txt
  • Dernière modification : 2013/11/12 13:38
  • de villersd