Un mazzo di 40 carte, ben mescolate, viene diviso, "del tutto a caso", in due parti eguali. Con che probabilità in entrambe le parti vi è lo stesso numero di carte nere e di carte rosse?
Non è un problema facilissimo.
Intanto determino quanti sono i modi in cui posso dividere il mazzo, ossia quanti sono i modi in cui posso scegliere 20 carte tra 40:
C40,20.
Devo poi calcolare quanti sono i modi in cui posso formare 20 carte (una delle due parti) pescandone 10 rosse e 10 nere. Automaticamente anche
le altre 20 carte saranno 10 rosse e 10 nere.
10 carte rosse tra 20 posso sceglierle in C20,10 modi; analogamente 10 carte nere posso sceglierle in C20,10 modi.
In definitiva la probabilità cercata è C20,10·C20,10/C40,20.
Sono numeri molto grandi, su cui non ha senso cercare di operare a mano. Usiamo il computer.
Possiamo usare questa calcolatrice o WolframAlpha, ottenendo:
Se voglio posso controllare il risultato studiando il problema con una simulazione (cosa che è utile fare, anche per controllare il procedimento: una cosa tipica di molti problemi probabilistici è che spesso è più facile modellizzare il problema e studiarlo sperimentalmente che risolverlo formalmente). Usiamo un programmino in JavaScript, software che è incorporato in tutti i browser. Basta andare qui: http://macosa.dima.unige.it/js/js.htm (puoi vedere anche qui), cliccare "macosa.dima.unige.it/js.com" e mettere nella finestra in alto quanto segue (in C ho messo le carte - numerate, da 1 a 40):
<pre><script> with(Math) { n=1e3; x=0; for(i=0; i<n; i=i+1) {C = new Array(40); C[1]=floor(random()*40+1); for(j=2; j<=20; j=j+1) { U=0; while(U<1) { C[j]=floor(random()*40+1); U=1; for(k=1;k<j;k=k+1) {if(C[k]==C[j]) U=0} } } s=0; A=0; for(j=1;j<=20;j=j+1) if(C[j]<=20) A=A+1; if(A==10) s=1; x=x+s} document.writeln ("n=",n," fr = ", x/n*100,"%") n=n*10; x=0; for(i=0; i<n; i=i+1) {C = new Array(40); C[1]=floor(random()*40+1); for(j=2; j<=20; j=j+1) { U=0; while(U<1) { C[j]=floor(random()*40+1); U=1; for(k=1;k<j;k=k+1) {if(C[k]==C[j]) U=0} } } s=0; A=0; for(j=1;j<=20;j=j+1) if(C[j]<=20) A=A+1; if(A==10) s=1; x=x+s} document.writeln ("n=",n," fr = ", x/n*100,"%") n=n*10; x=0; for(i=0; i<n; i=i+1) {C = new Array(40); C[1]=floor(random()*40+1); for(j=2; j<=20; j=j+1) { U=0; while(U<1) { C[j]=floor(random()*40+1); U=1; for(k=1;k<j;k=k+1) {if(C[k]==C[j]) U=0} } } s=0; A=0; for(j=1;j<=20;j=j+1) if(C[j]<=20) A=A+1; if(A==10) s=1; x=x+s} document.writeln ("n=",n," fr = ", x/n*100,"%") } </script></pre>
Ottengo:
n=1000 fr = 25.1% n=10000 fr = 24.59% n=100000 fr = 24.828%
Con 1 milione di prove posso avere:
n=1000000 fr = 24.7739%
Posso prendere l'arrotondamento 24.8%,
Posso controllare il risultato anche con questo altro script in cui modifico TruthValue nel modo seguente.
function TruthValue() { with(Math) { var C = new Array(40); C[1]=floor(random()*40+1); for(i=2; i <= 20; i++) { U=0; while(U < 1) { C[i]=floor(random()*40+1); U=1; for(j=1; j < i; j++) { if(C[j]==C[i]) {U=0} } } } V=0; A=0; for(i=1; i<=20; i++) {if(C[i]<=20) {A=A+1} } if(A==10) {V=1} }} n=640000 24.76390625% +/- 0.16186550334407687% n=320000 24.7678125% +/- 0.2289246794266651% n=160000 24.81875% +/- 0.32397190072722704% n=80000 24.76% +/- 0.4578030578704094% n=40000 24.8625% +/- 0.64833199786316% n=20000 24.75% +/- 0.9154991982187078% n=10000 24.2% +/- 1.284947123001912% Vediamo come potremmo usare R (vedi). # Un sottoprogramma che simula il problema dell'es. un generico numero di volte: calc <- function(volte) {OK <- 0; for(v in 1:volte) { # Metto in y in ordine casuale i primi 40 numeri interi positivi: y <- sample(1:40) # Considero neri i numeri da 1 a 20 e rossi quelli da 21 a 40 # Controllo se tra i primi 20 vi sono 10 neri, ossia numeri minori di 21 k <- 0; for(i in 1:20) if(y[i] < 21) k <- k+1; if(k==10) OK <- OK+1}; OK/volte*100} # calc(1e2) # 25 calc(1e3) # 24.5 calc(1e4) # 24.6 calc(1e5) # 24.777 calc(1e6) # 24.753 OK # Vedi qui per una valutazione pi efficiente. |