Qual è la probabilità che in una classe di 25 alunni (nati in un anno non bistestile) ve ne siano almeno due nati nello stesso giorno?

Sia Gn il giorno di nascita dell'alunno n-esimo nel registro di classe.
- La probabilità che G2 sia diverso da G1 è 364/365 (364 possibilità su 365).
- La probabilità che G3 sia diverso da G1 e da G2 è 363/365 e quella che, inoltre, G2 sia diverso da G1 è (364/365)·(363/365)=364/365·363/365
- …
- La probabilità che G25 sia diverso da G1, G2, … e G24 è 341/365 e quella che tutti i Gn (n=1,…,25) siano diversi tra loro è Q = 364/365·…·341/365 = 43%.
Trovata la probabilità Q che non ci siano due persone nate nello stesso giorno, la probabilità cercata è 1–Q = 57%.

Nel caso la classe fosse di 50 alunni la probabilità, calcolabile in modo analogo, sarebbe del 97%.

Come fare facilmente il calcolo?
Posso usare un semplice programmino in JavaScript, software incorporato in tutti i browser. Vai qui: http://macosa.dima.unige.it/js/js.htm, clicca "macosa.dima.unige.it/js.com" e metti nella finestra in alto:

<pre><script> with(Math) {
p=1; for(i=1; i<25; i=i+1) p=p*(365-i)/365; document.writeln ( (1-p)*100," %" )
p=1; for(i=1; i<50; i=i+1) p=p*(365-i)/365; document.writeln ( (1-p)*100," %" )
} </script></pre>

Ottieni:
56.8699703969464 %
97.03735795779884 %
  arrotondabili a 56.87% e 97.04%.

Per altri commenti: calcolo delle probabilità neGli Oggetti Matematici.
 


Vediamo come usare script.  Con integers* calcolo 341*...*364:

Poi con la calcolatrice

calcolo:

100 - 1.3483682051092098e+61 / pow(365,24) * 100
56.869970396946385

che posso arrotondare a 56.87.  Analogamente:


100 - 1.0568893943846726e+124 / pow(365,49) * 100 = 97.03735795779885

che arrotondo a 97.04

Altri modi di effettuare il calcolo.

Ecco i calcoli fatti con R, direttamente e con una simulazione:   (copia le righe - escluso il risultato - e incolla in R)
p = 1; for(i in 1:24) p = p*(365-i)/365; 1-p
## 0.5686997
p = 1; for(i in 1:49) p = p*(365-i)/365; 1-p
## 0.9703736
#
# Vedi SOTTO per un procedimento più veloce, caricando una libreria.
# tot: numero delle persone, prove: numero delle prove
tot <- 50; volte <- 0; prove <- 2000
for(j in 1:prove) {
  ok <- 0; x <- sample(1:365, tot, replace=TRUE)
  # Ho messo in x a caso i giorni di nascita di tot alunni
  # Pongo l'incremento ok=1 se ritrovo una stessa data di nascita
  for(i in 2:tot) {k <- 1;
    while(k < i) {if(x[i]==x[k]) {ok <-1; k <- i}; k <- k+1}
  }
 volte <- volte+ok
}
print(volte/prove*100)
  96.95
#
# Ovvero:
# tot: numero delle persone, prove: numero delle prove
tot <- 50; x <- NULL; volte <- 0; prove <- 1000
for(j in 1:prove) {
ok <- 0; for(i in 1:tot) {
x[i]<- floor(runif(1)*365)+1; k <- 1;
while(k < i) {if(x[i]==x[k]) {ok <-1; k <- i}; k <- k+1}
}
volte <- volte+ok
}
print(volte/prove*100)
  96.6

Procedimento più veloce (vedi) che dà anche una valutazione della precisione:
#
source("http://macosa.dima.unige.it/r.R")
#
PR = function(n) {f = 0; for (i in 1:n) f = f + ifelse(Event(),1,0)
 fr=f/n; S=sqrt(fr*(1-fr)/(n-1)); cat(fr*100, "+/-", 3*S*100,'\n'); fr0<<- fr; n0<<- n}
PR2 = function(n) {f=0; for (i in 1:n) f=f+ifelse(Event(),1,0); n=n+n0; f=f+fr0*n0
 fr=f/n;S=sqrt(fr*(1-fr)/(n-1));cat(fr*100,"+/-",3*S*100,'  n =',n,'\n');fr0<<-fr;n0<<-n}
#
tot=25
Event = function() {V=0; x=RUNIF(tot, 1,365); for(i in 1:(tot-1)) for(k in (i+1):tot) if(x[i]==x[k]) V=1; V}
#
PR(500)     # 55.4 +/- 6.675646
PR2(4500)   # 55.66 +/- 2.107896     n = 5000 
PR2(45000)  # 56.588 +/- 0.6649786   n = 50000 
PR2(450000) # 56.8332 +/- 0.2101419  n = 5e+05
tot=50
PR(500)     # 97.8 +/- 1.969934 
PR2(4500)   # 97.02 +/- 0.7214703    n = 5000 
PR2(45000)  # 96.98 +/- 0.229607     n = 50000 
PR2(450000) # 97.0536 +/- 0.07174446 n = 5e+05