Estimer la probabilité d’un doublon dans une liste aléatoire en Python

En choisissant un ensemble de 100 nombres entiers aléatoires compris entre 1 et 9999, on souhaite estimer la probabilité d’obtenir au moins un doublon, c’est à dire deux nombres identiques dans cette liste. Utilisons un programme Python pour approcher cette probabilité.

Estimer une probabilité Python

Comment estimer la probabilité d’un doublon dans une liste aléatoire en Python ?

1ère étape : générer la liste de nombres entiers aléatoires en Python

Pour cela on va utiliser le module random et une boucle for pour générer 100 nombres entiers aléatoires.

import random

liste_nombres_hasard = [random.randint(1, 9999) for x in range(100)]

1 et 9999 peuvent être remplacés par les bornes entre lesquelles vous souhaitez obtenir vos nombres aléatoires. 100 peut être remplacé par le nombre d’éléments voulus dans la liste.

2ème étape : extraire uniquement les doublons de la liste

On va utiliser le module iteration-utilities de Python.

from iteration_utilities import duplicates
from iteration_utilities import unique_everseen

def recupListUnique(liste):
        if(len(list(unique_everseen(duplicates(liste))))) > 0:
                return(1);
        else:
                return(0);

Cette fonction permet d’abord avec list(unique_everseen(duplicates(liste))) de récupérer la liste avec les nombres apparaissant en doublons, puis de calculer sa longueur. La fonction renvoie 1 si au moins un doublon est trouvé et sinon 0, on peut ainsi compter les listes avec au moins 1 doublon.

3ème étape : placer les codes précédents dans une boucle pour approcher la probabilité

Voici donc le programme complet pour estimer la probabilité d’avoir au moins un doublon.

import random

from iteration_utilities import duplicates
from iteration_utilities import unique_everseen

i = 1
nb_listes_avec_au_moins_un_doublon = 0 #permet de compter les listes avec au moins un doublon...
au_moins_un_doublon = 0 #variable renvoyée par la fonction : 1 si au moins un doublon trouvé, sinon 0

n = 10000 #Nombre de simulations (plus n est grand, plus le programme se rapproche de la probabilité)

for i in range(n):

        liste_nombres_hasard = [random.randint(1, 9999) for x in range(100)] #1 et 9999 sont les bornes pour le choix de l'entier aléatoire. 100 correspond au nombre de listes générées

        def recupListUnique(liste):
                if(len(list(unique_everseen(duplicates(liste))))) > 0:
                        return(1);
                else:
                        return(0);

        nb_listes_avec_au_moins_un_doublon = nb_listes_avec_au_moins_un_doublon + recupListUnique(liste_nombres_hasard) #Compte le nombre de liste avec au moins 1 doublon

print("Probabilité approchée d'un doublon : "+str(round(nb_listes_avec_au_moins_un_doublon/n*100,4))+'%') #On affiche la fréquence du nombre de listes avec au moins 1 doublon

Au global :

  • on parcourt n fois une boucle (plus n est grand, plus on s’approche de la probabilité) ;
  • dans cette boucle une liste de 100 nombres entiers entre 1 et 9999 est générée ;
  • on appelle une fonction permettant de récupérer uniquement les doublons de la liste ;
  • on vérifie la longueur de cette liste ;
  • si elle est supérieure à 0, on ajoute 1 au nombre de listes avec au moins un doublon ;
  • une fois les n boucles effectuées, on calcule la fréquence du nombre de listes avec au moins un doublon, en divisant le nombre de listes présentant un doublon par n, et en multipliant par 100 pour la présenter sous forme de pourcentage ;
  • la loi des grands nombres nous permet d’approcher la probabilité d’obtenir un doublon par la fréquence obtenue.

Quelle probabilité de doublons pour notre exemple ?

En lançant le programme pour n assez grand, on constate que pour notre exemple, la probabilité d’avoir au moins 1 doublon dans une liste de 100 nombres entiers aléatoires choisis entre 1 et 9999 est d’environ 39%.

Le programme peut ensuite être modifié pour changer les bornes des entiers aléatoires choisis et le nombre d’éléments dans la liste. Commentez pour toute remarque ou question !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.