Paradoxe des anniversaires

Calcul de la probabilité selon la taille du groupe

L'événement E1=“deux individus au moins ont le même anniversaire” est le complémentaire (le contraire) de l'événement E2=“tous les individus ont des dates différentes”. Calculons la probablité de E2 en fonction du nombre d'individus (plus facile à dénombrer). On néglige les années bissextiles pour simplifier les calculs.

pe2=function(n=20){
  p=1
  for(i in 1:(n-1)){ # remarquer les parenthèses autour de (n-1). 
  p <-p*(365-i)/365
  }
  p
    }

On peut maintenant calculer la probabilité qu'au moins 2 individus aient le même anniversaire:

Pcoincidence=function(n){
  1-pe2(n)
}

Pour 30 personnes, cette probabilité est donc de

Pcoincidence(30)
## [1] 0.7063162

Évolution de cette probabilité avec n:

x<-1:50
y <- numeric(length(x))
for (i in 1:length(x)) {
  y[i]<-Pcoincidence(i)
}
plot(x,y,xlab="nombre d'individus",ylab="Probabilité de coïncidence d'anniversaires")

plot of chunk unnamed-chunk-4

Généralisation à un ensemble plus grand

À vous de jouer ! Cette fois, les n individus sont des données (cryptées) et les “dates d'anniversaire” la sortie d'une fonction de hachage à valeurs dans un ensemble A de taille Card(A)=K.

# code à écrire

Simulation

On peut vérifier nos calculs en mesurant cette probabilité à l'aide d'une simulation. On génère un certain nombre (paramétrable) de dates d'anniversaires choisies uniformément entre 1 et 365 (on néglige toujours les années bissextiles) puis on regarde s'il y a au moins 2 valeurs identiques dans le groupe. Ensuite, pour estimer la probabilité, il faut répéter l'expérience…

gen_groupe=function(n=35){
  groupe=floor(365*runif(35,1/365))
  groupe}

verif=function(gp){
  collision=-1
  for(i in 2:length(gp)){
    for(j in 1:(i-1)){
      if(gp[i]==gp[j])
        collision=c(i,j)
    }
  }
  collision
}