1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| #!/usr/bin/env python3
# coding: utf-8
import random
def monty_hall(n, *, change, debug=False):
gain=0
for i in range(n):
# La porte gagnante est choisie
porte=random.choice("abc")
# La porte jouée est choisie
jeu=random.choice("abc")
# Si changement
if change:
# On mémorise la porte jouée car elle va changer
mem=jeu
# Si la porte gagnante n'a pas été choisie
if porte != jeu:
# La porte rejouée est obligatoirement gagnante
jeu=porte
else:
# La porte rejouée perd obligatoirement (on en prend donc une autre au pif)
jeu=random.choice(tuple(set("abc") - set(porte)))
# if
# if
# Si la porte gagnante a été choisie
if porte == jeu:
# Le gain augmente
gain+=1
# En mode debug
if debug:
print(
"Essai n° {0}/{1} - {2}, porte gagnante {3} ({4}): gain {5}".format(
i+1,
n,
"Premier choix {0}, second choix {1}".format(mem, jeu)\
if change else "Choix unique {0}".format(jeu),
porte,
"gagné" if porte == jeu else "perdu",
gain,
)
)
# if
# for
# On retourne le gain (finalement c'est la seule chose qui importe)
return gain
# monty_hall()
if __name__ == "__main__":
random.seed()
n=1_000_000
debug=False
g=monty_hall(n, change=True, debug=debug)
print("Avec changement: %d tirages, %d gains, ratio %.02f%%" % (n, g, g*100 / n))
g=monty_hall(n, change=False, debug=debug)
print("Sans changement: %d tirages, %d gains, ratio %.02f%%" % (n, g, g*100 / n))
# if |
Partager