Modélisation de la ruine du joueur 2020-2021

De Wiki du LAMA (UMR 5127)
Aller à la navigation Aller à la recherche

Dans le cadre du module de VISI201, nous allons réaliser la modélisation de la ruine d'un joueur. C'est à dire, à l'aide d'un programme, de comprendre comment les casinos arrivent à gagner de l'argent en proposant le jeu de la roulette. La première partie explique qu'est ce que la ruine d'un joueur. Puis nous vous proposons la simulation d'une soirée au casino. Et enfin une partie mathématique avec des calculs de probabilités, du temps moyen de jeu et des estimations numériques.


Qu'est ce que la ruine d'un joueur ?

Un joueur de roulette arrive au casino avec une somme d'argent finie, et il souhaite gagner une certaine somme d'argent. Le joueur repart soit quand il est ruiné soit quand il a gagné le montant qu'il voulait. Le temps est compté et il n'y a aucune stratégie pour gagner c'est un jeu de hasard. Si le joueur n'a pas de somme a atteindre et qu'il a un temps illimité il finira ruiné.

Règles de la roulette

Pour notre modélisation de la ruine d'un joueur, nous avons simplifié les règles de la roulette.

La roulette est constituée de 37 numéros : le 0 est vert, 18 pairs rouges et 18 impairs noirs.

Le joueur arrive avec une richesse initiale notée , il souhaite gagner euro. A chaque tour le joueur mise un euro sur les nombres pairs, si il tombe sur un nombre pair il gagne 1€ sinon il perd 1€. Si il tombe sur zéro il perd aussi 1€.

Une soirée au casino (simulation)

Pour la simulation nous posons trois variables :

 -  la richesse du joueur à l'entrée du casino
 -  le gain souhaité par le joueur
 -  la probabilité de gagner


Une partie de "Pile ou Face"

La partie de "Pile ou face" a pour but de lancer une pièce et de regarder sur quelle face elle tombe. Les pièces de monnaie étant équilibrées la probabilité de tomber sur pile est égal à la probabilité de tomber sur face, c'est à dire que la probabilité et de .

Pour la simulation on prend les mêmes règles que pour la roulette : le joueur mise sur une face si il a bon il gagne 1€, sinon il les perd.

def pile_ou_face(a,b):
    """simulation d'une soirée au casino (jeu de la roulette)

            en entrée : a la richesse initiale du joueur
                        b la somme que le joueur veut atteindre
            en sortie : g -> 0 si ruiné sinon 1
                        s le tableau de l'évolution de l'argent du joueur
                        t le temps de la partie """
    c = a   
    s = [a]
    while c != 0 and c < a + b :
        res = random.uniform(0,1) # renvoie un nombre entre 0 et 1
        if res <= 0.5: #Joueur à gagner cette mise
            c = c + 1
        else :       #Joueur à perdu cette mise
            c = c - 1
        s = s + [c]
    if c == 0 :         # Joueur ruiné
        g = 0
    elif c == a + b :   # Joueur a gagné
        g =  1
    t = len(s)          #Temps de jeu
    return s, g, t

ATTENTION : Pour exécuter ce code python il faut importer la librairie random

Cette simulation renvoie trois résultats. Le premier résultat correspond à l'évolution de la richesse du joueur, le deuxième résultat permet de savoir facilement si le joueur a gagné (soit ). Et le dernier résultat correspond au temps de jeu (c'est à dire le nombre de mises pour gagner ou être ruiné).

Une partie de roulette

Pour la simulation d'une partie de roulette, nous allons prendre les règles simplifiées.

Lors que le joueur mise sur pair il a une probabilité à chaque mise . Cette probabilité est dû au fait qu'il y a 37 cases au total et qu'il y a 18 cases gagnantes.

Le code reste le même sauf qu'il faut changer la probabilité de gagner à chaque mise.

def casino(a,b):
    """simulation d'une soirée au casino (jeu de la roulette)

            en entrée : a la richesse initiale du joueur
                        b la somme que le joueur veut atteindre
            en sortie : g -> 0 si ruiné sinon 1
                        s le tableau de l'évolution de l'argent du joueur
                        t le temps de la partie """
    c = a   
    s = [a]
    while c != 0 and c < a + b :
        res = random.uniform(0,1) # renvoie un nombre entre 0 et 1
        if res <= 18/37: #Joueur à gagner cette mise
            c = c + 1
        else :       #Joueur à perdu cette mise
            c = c - 1
        s = s + [c]
    if c == 0 :         # Joueur ruiné
        g = 0
    elif c == a + b :   # Joueur a gagné
        g =  1
    t = len(s)          #Temps de jeu
    return s, g, t

ATTENTION : Pour exécuter ce code python il faut importer la librairie random

Cette simulation renvoie trois résultats. Le premier résultat correspond à l'évolution de la richesse du joueur, le deuxième résultat permet de savoir facilement si le joueur a gagné (soit ). Et le dernier résultat correspond au temps de jeu (c'est à dire le nombre de mises pour gagner ou être ruiné).

Code général

Nous vous proposons un code général qui permet de calculer tout type de jeux qui se font sur plusieurs mises. La deuxième fonction permet d'avoir le même résultat mais trace en plus un graphe de l'évolution de la richesse du joueur.


def ruine(a,b,p):
    """simulation d'une soirée au casino (jeu de la roulette)

            en entrée : a la richesse initiale du joueur
                        b la somme que le joueur veut atteindre
                        p la probabilité de gagner (mise pair)
            en sortie : g -> 0 si ruiné sinon 1
                        s le tableau de l'évolution de l'argent du joueur
                        t le temps de la partie """
    c = a   
    s = [a]
    while c != 0 and c < a + b :
        res = random.uniform(0,1) # renvoie un nombre entre 0 et 1
        if res <= p: #Joueur à gagner cette mise
            c = c + 1
        else :       #Joueur à perdu cette mise
            c = c - 1
        s = s + [c]
    if c == 0 :         # Joueur ruiné
        g = 0
    elif c == a + b :   # Joueur a gagné
        g =  1
    t = len(s)          #Temps de jeu
    return s, g, t

def graphe(a,b,p):
    """fonction qui trace le graphe de l'évolution de la richesse du joueur
            en entrée : a la richesse initiale du joueur
                        b la somme que le joueur veut atteindre
                        p la probabilité de gagner (mise pair)
            en sortie : le graphe """
    
    casino = ruine(a,b,p)
    print(casino)
    plt.clf()                               #pas de graphe antérieur sur la figure
    x = [i for i in range(len(casino[0]))]  #coordonées en x
    y = casino[0]                           #coordonnées en y

    plt.plot(x,y)                           #dessin du graphe
    plt.title("simulation d'une soirée au casino")#titre du graphe
    plt.xlabel("n° de mise")                #titre de l'axe des abscisses
    plt.ylabel("richesse du joueur")        #titre de l'axe des ordonnées

    plt.show()                              #afficher le graphe
    plt.close

ATTENTION :

  • Pour exécuter ce code python il faut importer les librairies random et matplotlib.pyplot.
  • Pour exécuter la procédure graphe il faut copier les deux fonctions dans un interpréteur python.

Cette simulation renvoie trois résultats. Le premier résultat correspond à l'évolution de la richesse du joueur, le deuxième résultat permet de savoir facilement si le joueur a gagné (soit ). Et le dernier résultat correspond au temps de jeu (c'est à dire le nombre de mises pour gagner ou être ruiné).

Calculs de probabilités

Pour le calcul de la probabilité de perdre, nous allons nous intéresser seulement à celle d'une soirée d'un casino. Le code est adapté pour calculer la probabilité de perdre pour tous les jeux.

Pour avoir la probabilité de gagner il suffit de soustraire la probabilité de perdre à 1.

Probabilité de perdre

Pour notre calcul de la probabilité de perdre, nous devons simuler plusieurs mise et le divisé par le nombre de mise.

def est_ruine(a,b,p,nb):
    """Fonction qui compte le nombre de fois ou le joueur est ruiné

            en entrée : a la richesse initiale du joueur
                        b la somme que le joueur veut atteindre
                        p la probabilité de gagner (mise pair)
                        nb le nombre de soirée
            en sortie : une probabilité, le nombre de fois ou le joueur repart ruiné"""
    i = 0
    res = 0
    while nb > i :
        
        if ruine(a,b,p)[1] != 1:
            res = res + 1
        i = i + 1
    return res / nb

ATTENTION Pour exécuter cette fonction il faut aussi prendre la fonction Code général.

Calcul du temps moyen de jeu

Le calcul du temps moyen se fait comme le calcul de la probabilité de perdre. Nous simulons une soirée avec plusieurs mises, nous regardons le temps de jeu, et nous divisons par le nombre de mises.

Le code suivant permet de calculer le temps moyen de jeu

def temps_moy(a,b,p,nb):
    """Fonction qui calcul le temps moyen d'une soirée au casino

        en entrée : a la richesse initiale du joueur
                        b la somme que le joueur veut atteindre
                        p la probabilité de gagner (mise pair)
                        nb le nombre de soirée
        en sortie : un entier, le temps moyen passé au casino"""
    d = 0
    c = 0 
    for i in range (nb):
        c = ruine(a,b,p)[2]
        
        d = d + c
       
    res = d / nb
    return res

ATTENTION Pour exécuter cette fonction il faut aussi prendre la fonction Code général.

Estimations numériques

L'estimation numérique varie en fonction de la probabilité.

Nous avons la richesse initiale, la somme à gagner

Pour une partie de "Pile ou Face"

Pour calculer la valeur théorique de la probabilité de perdre : .

Pour le calcul de la probabilité de gagner : .


Pour le calcul de l'estimation du temps de jeu : .

Pour une partie de roulette

Pour faciliter les calculs suivant on note tout d'abord que


Pour calculer la valeur théorique de la probabilité de perdre : .

Pour le calcul de la probabilité de gagner : .


Pour le calcul de l'estimation du temps de jeu : .


Code

Le code suivant permet de calculer les différentes valeurs théoriques :

def theorie(a,b,p):
    """Fonction qui nous donne les résultats théoriques

            en entrée : a, la richesse initiale du joueur
                        b, la somme que le joueur veut atteindre
                        p, la probabilité de gagner
            en sortie : des flottants """
    if p == 1/2 :               #Probabilité de gagner
        pRuine = b /(a + b)     #Proba théorique de perdre
        pGagne = a / (a + b)    #Proba théorique de gagner
        eT = a*b                #Estimation théorique du temps de jeu
        res = (pRuine, pGagne, eT)
    else :
        r = (1 - p) / p
        pRuine = (r**(a+b)-r**a)/(r**(a+b)-1)
        pGagne = (r**a-1)/(r**(a+b)-1)
        eT = 1/(2*p-1)*((((a+b)*(1-r**a))/(1-r**(a+b)))-a)
        res = (pRuine, pGagne, eT)
    
    return res

Cette fonction renvoie un tuple. La première valeur correspond à la valeur théorique de la probabilité de perdre, la deuxième valeur est la valeur théorique de la probabilité de gagner et enfin la dernière valeur est la valeur théorique de l'estimation du temps.


Graphes


Le code complet du projet.

Le code compote les fonctions pour créer les graphes en fonction de vos valeurs initiale


CONCLUSION


Ce projet à été réalisé par BOITOUZET Emilien (Tuteur : LABART Céline)