######################################################### # CORRECTION TP6 (MATHEMATIQUES POUR L'INFORMATIQUE) # SUJET: VARIATIONS AUTOUR DES PROBABILITES # # INDICATIONS: NÉANT. ######################################################### from random import * from math import * # La fonction renvoie le couple des probabilités estimées # selon les deux stratégies de jeu: # le premier terme si l'on ne change jamais de porte # le second terme si l'on change systématiquement de porte def MontyHall(n): CIC = 0 # nombre de Cadillac gagnées si Choix Initial Conservé CIM = 0 # nombre de Cadillac gagnées si Choix Initial Modifié for partie in range(n): Cadillac = randint(0,2) # Cadillac cachée au hasard porte = randint(0,2) # Porte choisie au hasard par joueur if (porte == Cadillac): CIC += 1 # stratégie "fixe" gagne, l'autre perd else: CIM +=1 # stratégie "fixe" perd, l'autre gagne return (CIC/n, CIM/n) # le calcul du code de la lettre "A" permet de # translater correctement les valeurs. def Codec(x): shift = ord("A") if type(x) == int: return chr(x + shift) elif type(x) == str: return ord(x) - shift def Init(): return Codec(randint(0,2)) # Un simple calcul modulo 3 permet de gérer le sens du parcours def Prochain(P): if random() < 0.75: return Codec((Codec(P) + 1) % 3) else: return Codec((Codec(P) + 2) % 3) # Il suffit de boucler sur P et de concatener # NB. Le dernier point calculé n'est pas utilisé def Chemin(P,n): chaine = "" for i in range(n): chaine += P P = Prochain(P) return chaine # On arrondi la probabilité à 4 chiffres après la virgule # NB. Le nombre de parcours simulés est arbitrairement # fixé à 1000 fois le nombre de sommets à rencontrer. def Estimation(n): PROB = {"A":0, "B":0, "C":0} P = Init() nbtest = 1000*n for test in range(nbtest): sommet = Chemin(P,n)[-1] PROB[sommet] += 1 for sommet in PROB.keys(): PROB[sommet] /= nbtest return (round(PROB["A"],4),round(PROB["B"],4),round(PROB["C"],4)) print(Chemin("A",1)) n = int(input("Nb sommets: ")) print(Estimation(n))