« Modélisation de la ruine du joueur » : différence entre les versions
Ligne 177 : | Ligne 177 : | ||
Afin de modéliser la ruine du joueur on peut utiliser ce programme python : |
Afin de modéliser la ruine du joueur on peut utiliser ce programme python : |
||
<pre> |
|||
... |
|||
from random import random |
|||
from matplotlib import pyplot as plt |
|||
PROBABILITE = (18/37) #18/37 Pour la roulette |
|||
SOMME_DEPART = 10 |
|||
GAIN_FIN = 5 |
|||
#Faire varier Nombre de Parties |
|||
NOMBRE_PARTIES = 1000 |
|||
def simule_soiree(initial:int = SOMME_DEPART, fin:int= GAIN_FIN, prob:int= PROBABILITE) -> tuple: |
|||
""" Simule une soirée au casino """ |
|||
tab = [initial] |
|||
somme = initial |
|||
while somme > 0 and somme < initial + fin: |
|||
aleatoire = random() |
|||
if aleatoire <= prob: |
|||
somme += 1 |
|||
else: |
|||
somme -= 1 |
|||
tab = tab + [somme] |
|||
if somme == initial + fin: |
|||
res = True |
|||
else: |
|||
res = False |
|||
return (tab, res) |
|||
def simule_nombre_parties(n:int = NOMBRE_PARTIES) -> list: |
|||
"""Renvoie un tableau de longueur n avec le resultat de chaque partie""" |
|||
res = [] |
|||
for i in range(n): |
|||
res = res + [simule_soiree()] |
|||
return res |
|||
# Permet d'afficher une partie jouée. |
|||
def affiche_graphe() -> None: |
|||
""" Affiche le graphe d'une soirée au casino """ |
|||
y = simule_soiree()[0] |
|||
x = [[i] for i in range(len(y))] |
|||
plt.title("Graphe d'une soirée au casino") |
|||
plt.xlabel("Instant I") |
|||
plt.ylabel("Somme instant I") |
|||
plt.plot(x,y) |
|||
plt.show() |
|||
affiche_graphe() |
|||
R = (1-PROBABILITE) / (PROBABILITE) |
|||
def calcule_proba_defaite_theorique() -> float: |
|||
"""Renvoie la probabilité de defaite théorique""" |
|||
if PROBABILITE == 0.5: |
|||
res = (GAIN_FIN) / (SOMME_DEPART + GAIN_FIN) |
|||
else: |
|||
numerateur = (R**(SOMME_DEPART + GAIN_FIN) - R**(SOMME_DEPART)) |
|||
denumerateur = (R**(SOMME_DEPART + GAIN_FIN) - 1) |
|||
res = numerateur / denumerateur |
|||
return res |
|||
def calcule_proba_victoire_theorique() -> float: |
|||
"""Renvoie la probabilité de victoire théorique""" |
|||
if PROBABILITE == 0.5: |
|||
res = (SOMME_DEPART) / (SOMME_DEPART + GAIN_FIN) |
|||
else: |
|||
numerateur = R**(SOMME_DEPART) - 1 |
|||
denumerateur = (R**(SOMME_DEPART + GAIN_FIN) - 1) |
|||
res = numerateur / denumerateur |
|||
return res |
|||
def calcule_duree_partie_theorique() -> float: |
|||
"""Renvoie la durée theorique d'une partie""" |
|||
if PROBABILITE == 0.5: |
|||
res = SOMME_DEPART * GAIN_FIN |
|||
else: |
|||
numerateur = (SOMME_DEPART + GAIN_FIN) * (1 - R**SOMME_DEPART) |
|||
denumerateur = 1 - R**(SOMME_DEPART + GAIN_FIN) |
|||
res = (1 / (2 * PROBABILITE - 1)) * ((numerateur / denumerateur) - SOMME_DEPART) |
|||
return res |
|||
def calcule_nombre_victoire(tab_parties = SIMULATION_N_SOIREE) -> int: |
|||
""" Renvoie le nombre de victoires dans les parties jouées""" |
|||
compteur = 0 |
|||
for res_partie in tab_parties: |
|||
if res_partie[1] == True: |
|||
compteur = compteur + 1 |
|||
return compteur |
|||
def calcule_proba_victoire(tab_parties = SIMULATION_N_SOIREE) -> float: |
|||
"""Renvoie la probabilité de victoire sur M parties""" |
|||
nb_victoires = calcule_nombre_victoire(tab_parties) |
|||
res = nb_victoires/len(tab_parties) |
|||
return res |
|||
def calcule_proba_defaite(tab_parties = SIMULATION_N_SOIREE) -> float: |
|||
"""Renvoie la probabilité de défaite sur M parties""" |
|||
res = (NOMBRE_PARTIES - calcule_nombre_victoire(tab_parties)) / len(tab_parties) |
|||
return res |
|||
def calcule_duree_moyenne(): |
|||
somme = 0 |
|||
for partie in SIMULATION_N_SOIREE: |
|||
duree_partie = len(partie[0]) |
|||
somme += duree_partie |
|||
res = somme / NOMBRE_PARTIES |
|||
return res |
|||
Voici les valeurs theoriques : |
|||
La probabilité de victoire : 0.5812626435530369 |
|||
La probabilité de defaite : 0.4187373564469631 |
|||
Durée partie moyenne theorique : 1334.2610407391421 |
|||
Voici les valeurs avec nos resultats : |
|||
La probabilité de victoire : 0.592 |
|||
La probabilité de defaite : 0.408 |
|||
Durée partie moyenne : 1358.222 |
|||
TAB_NB_PARTIES = [1, 5, 10 ,20, 50, 100, 200, 500] |
|||
def simule_proba_selon_n(nb_partie = TAB_NB_PARTIES): |
|||
res = [] |
|||
for n in nb_partie : |
|||
tab = simule_nombre_parties(n) |
|||
proba_victoire = calcule_proba_victoire(tab) |
|||
res += [proba_victoire] |
|||
return res |
|||
def affiche_proba_nb_partie (parties: list): |
|||
tab = [] |
|||
for ele in parties: |
|||
print(ele) |
|||
tab = tab + [ele] |
|||
vict_theorique = calcule_proba_victoire_theorique() |
|||
theorique_depart = [vict_theorique] * len(tab) |
|||
x = [[i] for i in range(len(tab))] |
|||
plt.title("Graphe d'une soirée au casino") |
|||
plt.xlabel("N Parties") |
|||
plt.ylabel("Proba victoire sur N parties") |
|||
plt.plot(x,theorique_depart) |
|||
plt.plot(x,tab) |
|||
default_x_ticks = range(len(x)) |
|||
plt.xticks(default_x_ticks, TAB_NB_PARTIES) |
|||
plt.show() |
|||
proba_selon_n = simule_proba_selon_n() |
|||
affiche_proba_nb_partie(proba_selon_n) |
|||
</pre> |
Version du 14 mai 2024 à 20:21
Modélisation de la ruine du joueur
Nous nous intéressons à l'étude des gains d'un joueur lors d'une soirée au casino, dans lequel le joueur joue à la roulette russe.
Le joueur commence avec une somme initiale comprise entre 0 et la somme souhaitée, le joueur s'arrête uniquement si :
- il obtient la somme souhaitée - le joueur est ruiné (la somme est égale à 0)
Pour cela le joueur va jouer à la roulette en misant à chaque fois 1 jeton qu'il peut doubler ou perdre.
Estimations numériques
Nous allons prendre pour base le document suivant : Ruine
Notre objectif est de trouver de :
- calculer la probabilité de victoire, soit d'atteindre la somme souhaitée, en partant de la somme de départ. - calculer la durée de la partie, soit le joueur arrête de jouer, donc il atteint l'une des conditions d'arrêt.
On définit de manière générale p la probabilité de victoire d'une partie et q = (1-p)
Estimation de la probabilité de gagner
On veut trouver une formule qui permet de trouver la probabilité de victoire lors d'une soirée au casino selon les paramètres de départs, soit la somme de départ et la somme voulue et la probabilité de victoire.
On commence avec la loi de probabilité totale :
Ce qui donne le système suivant :
On cherche l'équation quadratique :
On a l'équation :
On remplace par :
On divise par :
On résoult l'équation
Pour p = 1/2
Ca qui donne la solution unique :
On en déduit les valeurs :
On a donc formule suivante :
Pour les autres probabilités
Ce qui donne les solutions :
On a alors :
On en déduit les valeurs :
On obtient :
D'où :
On a donc formule suivante :
Estimation du temps moyen de jeu
Ce qui donne l'équation :
On note, pour
On a donc la relation de récurence :
Pour p = 1/2
On a
donc,
d'où
Alors pour
Or
Donc
Pour les autres probabilités
On pose le réel l qui verifie qui est donc
La relation devient donc
Par conséquent,
Donc pour , on a :
Or
Donc
Simulation d'une partie
Afin de modéliser la ruine du joueur on peut utiliser ce programme python :
from random import random from matplotlib import pyplot as plt PROBABILITE = (18/37) #18/37 Pour la roulette SOMME_DEPART = 10 GAIN_FIN = 5 #Faire varier Nombre de Parties NOMBRE_PARTIES = 1000 def simule_soiree(initial:int = SOMME_DEPART, fin:int= GAIN_FIN, prob:int= PROBABILITE) -> tuple: """ Simule une soirée au casino """ tab = [initial] somme = initial while somme > 0 and somme < initial + fin: aleatoire = random() if aleatoire <= prob: somme += 1 else: somme -= 1 tab = tab + [somme] if somme == initial + fin: res = True else: res = False return (tab, res) def simule_nombre_parties(n:int = NOMBRE_PARTIES) -> list: """Renvoie un tableau de longueur n avec le resultat de chaque partie""" res = [] for i in range(n): res = res + [simule_soiree()] return res # Permet d'afficher une partie jouée. def affiche_graphe() -> None: """ Affiche le graphe d'une soirée au casino """ y = simule_soiree()[0] x = [[i] for i in range(len(y))] plt.title("Graphe d'une soirée au casino") plt.xlabel("Instant I") plt.ylabel("Somme instant I") plt.plot(x,y) plt.show() affiche_graphe() R = (1-PROBABILITE) / (PROBABILITE) def calcule_proba_defaite_theorique() -> float: """Renvoie la probabilité de defaite théorique""" if PROBABILITE == 0.5: res = (GAIN_FIN) / (SOMME_DEPART + GAIN_FIN) else: numerateur = (R**(SOMME_DEPART + GAIN_FIN) - R**(SOMME_DEPART)) denumerateur = (R**(SOMME_DEPART + GAIN_FIN) - 1) res = numerateur / denumerateur return res def calcule_proba_victoire_theorique() -> float: """Renvoie la probabilité de victoire théorique""" if PROBABILITE == 0.5: res = (SOMME_DEPART) / (SOMME_DEPART + GAIN_FIN) else: numerateur = R**(SOMME_DEPART) - 1 denumerateur = (R**(SOMME_DEPART + GAIN_FIN) - 1) res = numerateur / denumerateur return res def calcule_duree_partie_theorique() -> float: """Renvoie la durée theorique d'une partie""" if PROBABILITE == 0.5: res = SOMME_DEPART * GAIN_FIN else: numerateur = (SOMME_DEPART + GAIN_FIN) * (1 - R**SOMME_DEPART) denumerateur = 1 - R**(SOMME_DEPART + GAIN_FIN) res = (1 / (2 * PROBABILITE - 1)) * ((numerateur / denumerateur) - SOMME_DEPART) return res def calcule_nombre_victoire(tab_parties = SIMULATION_N_SOIREE) -> int: """ Renvoie le nombre de victoires dans les parties jouées""" compteur = 0 for res_partie in tab_parties: if res_partie[1] == True: compteur = compteur + 1 return compteur def calcule_proba_victoire(tab_parties = SIMULATION_N_SOIREE) -> float: """Renvoie la probabilité de victoire sur M parties""" nb_victoires = calcule_nombre_victoire(tab_parties) res = nb_victoires/len(tab_parties) return res def calcule_proba_defaite(tab_parties = SIMULATION_N_SOIREE) -> float: """Renvoie la probabilité de défaite sur M parties""" res = (NOMBRE_PARTIES - calcule_nombre_victoire(tab_parties)) / len(tab_parties) return res def calcule_duree_moyenne(): somme = 0 for partie in SIMULATION_N_SOIREE: duree_partie = len(partie[0]) somme += duree_partie res = somme / NOMBRE_PARTIES return res Voici les valeurs theoriques : La probabilité de victoire : 0.5812626435530369 La probabilité de defaite : 0.4187373564469631 Durée partie moyenne theorique : 1334.2610407391421 Voici les valeurs avec nos resultats : La probabilité de victoire : 0.592 La probabilité de defaite : 0.408 Durée partie moyenne : 1358.222 TAB_NB_PARTIES = [1, 5, 10 ,20, 50, 100, 200, 500] def simule_proba_selon_n(nb_partie = TAB_NB_PARTIES): res = [] for n in nb_partie : tab = simule_nombre_parties(n) proba_victoire = calcule_proba_victoire(tab) res += [proba_victoire] return res def affiche_proba_nb_partie (parties: list): tab = [] for ele in parties: print(ele) tab = tab + [ele] vict_theorique = calcule_proba_victoire_theorique() theorique_depart = [vict_theorique] * len(tab) x = [[i] for i in range(len(tab))] plt.title("Graphe d'une soirée au casino") plt.xlabel("N Parties") plt.ylabel("Proba victoire sur N parties") plt.plot(x,theorique_depart) plt.plot(x,tab) default_x_ticks = range(len(x)) plt.xticks(default_x_ticks, TAB_NB_PARTIES) plt.show() proba_selon_n = simule_proba_selon_n() affiche_proba_nb_partie(proba_selon_n)