-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscript.py
More file actions
85 lines (66 loc) · 3.05 KB
/
script.py
File metadata and controls
85 lines (66 loc) · 3.05 KB
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# Monty Hall simulation converted from monty-hall-demo.ipynb
# Convention: 0 pour les chèvres, 1 pour la voiture.
# Nous allons faire une simulation sur N parties.
from random import randint
import numpy as np
def run_simulation(N: int = 1000) -> None:
"""Simule N parties du problème de Monty Hall et affiche les ratios de victoire
pour les stratégies "rester" et "changer".
Les commentaires et textes explicatifs provenant du notebook original
sont inclus comme commentaires dans ce script.
"""
# Initialisation d'un tableau N x 3 pour stocker la position de la voiture
simuls = np.zeros((N, 3), dtype=int)
# Génération aléatoire de la voiture dans chaque partie
for i in range(N):
car_ind = randint(0, 2)
simuls[i, car_ind] = 1
# Simulons les parties où le joueur ne change pas de porte. C-a-d son choix initial
# ne change pas, donc est définitif, quel que soit la porte ouverte par l'animateur.
stays_and_wins = 0
for i in range(N):
# choix du joueur
player_choice = randint(0, 2)
# vérification du succès
if simuls[i, player_choice] == 1:
stays_and_wins += 1
# calcul du ratio de succès
ratio_stays_wins = stays_and_wins / N
print(f"Ratio de succès en ne changeant pas de porte : {ratio_stays_wins}")
# Simulons les parties où le joueur change de porte après l'ouverture d'une porte par l'animateur.
switches_and_wins = 0
for i in range(N):
# choix aléatoire du joueur
choice_1 = randint(0, 2)
# ouverture par l'animateur d'une porte contenant une chèvre
# (on choisit la première porte possible qui n'est ni le choix du joueur
# ni la voiture)
anime_choice = None
possible_doors_to_open = [0, 1, 2]
possible_doors_to_open.remove(choice_1)
for door in possible_doors_to_open:
if simuls[i, door] == 0:
anime_choice = door
break
# Au cas improbable (logique défensive), si aucun n'a été trouvé, choisir
# une porte aléatoire parmi les possibles
if anime_choice is None:
anime_choice = possible_doors_to_open[0]
# switch du joueur: enlever la porte de l'animateur et le choix initial
possible_switches = [0, 1, 2]
possible_switches.remove(choice_1)
possible_switches.remove(anime_choice)
choice_2 = possible_switches[0]
# vérification du succès
if simuls[i, choice_2] == 1:
switches_and_wins += 1
# calcul du ratio de succès
ratio_switches_wins = switches_and_wins / N
print(f"Ratio de succès en changeant de porte : {ratio_switches_wins}")
# Conclusion (commentaire depuis le notebook)
# On remarque que le ratio de succès en changeant de porte est environ 2 fois
# plus élevé que celui en ne changeant pas de porte, confirmant ainsi la
# stratégie optimale dans le problème de Monty Hall.
if __name__ == '__main__':
# Nombre de simulations par défaut
run_simulation(1000)