SUPERCAT.DEV

Benvenut* sul mio blog

MATH

09 - Esattamente due assi in cinque carte: dalla combinatoria all'ipergeometrica

20-08-2026

Probabilità e combinatoria nei giochi

Nel precedente articolo abbiamo studiato due assi consecutivi.

L'ordine delle estrazioni era importante perché volevamo descrivere cosa succedeva passo dopo passo:

$$ 4/52 \cdot 3/51 $$

Ora cambiamo domanda.

Mescoliamo un mazzo standard di 52 carte, distribuiamo una mano di cinque carte e chiediamoci:

Qual è la probabilità che la mano contenga esattamente due assi?

Questa volta non ci interessa in quale posizione siano usciti.

Una mano con:

A♠ 7♦ A♥ K♣ 3♠

e una con le stesse cinque carte in ordine diverso rappresentano lo stesso risultato.

Il problema quindi non richiede disposizioni, ma combinazioni.

Ed è proprio da questo conteggio che nasce la distribuzione ipergeometrica.

Dividiamo il mazzo in due gruppi

Nel mazzo abbiamo:

4 assi

e:

48 non assi

Vogliamo una mano di cinque carte che contenga:

esattamente 2 assi

e quindi necessariamente:

esattamente 3 non assi

Il problema diventa:

scegli 2 carte tra i 4 assi
e
scegli 3 carte tra i 48 non assi

L'ordine non conta in nessuna delle due scelte.

Quanti modi ci sono di scegliere i due assi?

Abbiamo quattro assi e ne vogliamo due:

C(4,2)
=
6

Queste sono le possibili coppie di assi.

Non ci interessa quale dei due sia stato estratto prima.

Quanti modi ci sono di scegliere le altre tre carte?

Le altre tre carte devono essere non assi.

Ne abbiamo:

48

e dobbiamo sceglierne:

3

quindi:

C(48,3)
=
17.296

Mettiamo insieme le due scelte

Per ciascuna coppia di assi possiamo scegliere una qualsiasi terna di non assi.

Per il principio del prodotto:

casi favorevoli
=
C(4,2) · C(48,3)

cioè:

6 · 17.296
=
103.776

Esistono quindi:

103.776

mani di cinque carte contenenti esattamente due assi.

Quante mani di cinque carte esistono in totale?

Questo numero è già comparso negli articoli combinatori precedenti.

Una mano di cinque carte viene scelta da un mazzo di 52 e l'ordine non conta:

C(52,5)
=
2.598.960

Quindi:

P(esattamente 2 assi)
=
C(4,2) · C(48,3)
------------------
C(52,5)

ossia:

$$ P = 103.776 / 2.598.960 $$

La frazione si semplifica a:

$$ 2162 / 54145 $$

e vale circa:

3,993%

Perché moltiplichiamo C(4,2) per C(48,3)?

Vale la pena soffermarsi su questo passaggio.

Una mano favorevole deve soddisfare due condizioni contemporaneamente:

avere 2 assi

e:

avere 3 non assi

Per ogni scelta dei due assi possiamo associare qualsiasi scelta delle tre carte non assi.

Per questo usiamo il principio del prodotto:

$$ 6 \cdot 17.296 $$

Non stiamo sommando i due conteggi perché non stiamo scegliendo tra due alternative.

Una mano favorevole deve contenere entrambe le parti.

Perché il denominatore è C(52,5)?

Il numeratore conta mani non ordinate di cinque carte.

Anche il denominatore deve quindi contare lo stesso tipo di oggetto:

mani non ordinate di cinque carte

Per questo usiamo:

$$ \binom{52}{5} $$

e non:

$$ D(52,5) $$

Se usassimo sequenze ordinate al denominatore e mani non ordinate al numeratore, confronteremmo oggetti diversi e la probabilità sarebbe sbagliata.

È la stessa regola che stiamo usando dall'inizio della serie:

numeratore e denominatore devono descrivere lo stesso spazio campionario.

Il nome arriva dopo il ragionamento: distribuzione ipergeometrica

Il problema che abbiamo appena risolto ha una struttura molto generale.

Abbiamo una popolazione finita di:

$$ N $$

elementi.

Tra questi:

K

sono considerati successi.

Estraiamo:

$$ n $$

elementi senza reinserimento.

Vogliamo sapere la probabilità di trovare esattamente:

x

successi.

Il conteggio è:

$$ \binom{K}{x} \cdot \binom{N-K}{n-x} $$

mentre tutti i campioni possibili sono:

$$ \binom{N}{n} $$

Quindi:

P(X = x)
=
C(K,x) · C(N-K,n-x)
---------------------
C(N,n)

Questa è la distribuzione ipergeometrica.

Nel nostro esempio:

$$ \begin{gathered} N = 52 \ K = 4 \ n = 5 \ x = 2 \end{gathered} $$

e la formula torna esattamente al calcolo fatto prima.

La cosa importante è che non abbiamo avuto bisogno del nome "ipergeometrica" per trovare la soluzione.

Il nome serve a riconoscere che molti problemi diversi condividono la stessa struttura.

La stessa struttura nel Keno: quanti numeri vengono centrati?

L'ipergeometrica non appartiene alle carte. Compare ogni volta che selezioniamo senza reinserimento da una popolazione finita.

Nel Keno consideriamo un ticket con 3 numeri marcati fra 80; il gioco estrae 20 numeri diversi. Definiamo:

$$ X=\text{numero di nostri numeri presenti fra i 20 estratti}. $$

Allora:

$$ N=80, \qquad K=3, \qquad n=20. $$

La probabilità di centrare tutti e tre è:

$$ P(X=3)

\frac{\binom33\binom{77}{17}}{\binom{80}{20}} \approx0{,}0138754, $$

cioè circa:

$$ 1{,}3875%. $$

Per centrarne esattamente due:

$$ P(X=2)

\frac{\binom32\binom{77}{18}}{\binom{80}{20}} \approx0{,}138754, $$

circa il 13,8754%.

Possiamo ottenere gli stessi numeri guardando il problema dall'altro lato: una volta fissati i 20 numeri vincenti, scegliamo 3 numeri fra 80 e chiediamo quanti cadono nei 20. Per esempio:

$$ P(X=3)

\frac{\binom{20}{3}}{\binom{80}{3}}. $$

Sono due conteggi diversi dello stesso esperimento probabilistico.

Questo esempio prepara anche il valore atteso: una volta conosciuta la distribuzione del numero di centri, una paytable può trasformare ogni valore di $X$ in un premio e quindi in un risultato medio.

Fonte di contesto didattico: Amanda Harsy, Karen Holmes, Scott Kaschner e Marie Meyer, “Counting Your Winnings at the Casino”, in Mindy Capaldi (ed.), Teaching Mathematics Through Games, cap. 5. I valori qui pubblicati sono ricalcolati dalla formula ipergeometrica.

Perché senza reinserimento è fondamentale

La distribuzione ipergeometrica descrive un campionamento senza reinserimento.

Dopo aver pescato una carta, quella carta non può comparire di nuovo nella stessa mano.

Di conseguenza le estrazioni non sono indipendenti.

È proprio questa caratteristica che distingue il problema da quello binomiale che incontreremo nel prossimo articolo.

Con un dado lanciato dieci volte, ogni prova riparte nelle stesse condizioni.

Con cinque carte pescate dallo stesso mazzo, invece, ogni estrazione modifica ciò che rimane.

"Esattamente due" significa anche escludere gli altri assi

Un errore frequente sarebbe ragionare così:

scelgo 2 assi tra 4
e poi scelgo altre 3 carte tra le 50 rimaste

cioè:

$$ \binom{4}{2} \cdot \binom{50}{3} $$

Questo conteggio non rappresenta "esattamente due assi".

Tra le 50 carte rimaste ci sono infatti ancora gli altri due assi.

Alcune delle terne scelte conterrebbero quindi un terzo o addirittura un quarto asso.

Per imporre esattamente due, le altre tre carte devono essere scelte esclusivamente tra:

48 non assi

Per questo il termine corretto è:

$$ \binom{48}{3} $$

La parola "esattamente" è quindi una parte matematica del problema, non un dettaglio linguistico.

E se volessimo almeno due assi?

"Esattamente due" e "almeno due" sono eventi diversi.

Almeno due significa:

2 assi
oppure
3 assi
oppure
4 assi

Quindi dovremmo sommare:

$$ P(X=2) + P(X=3) + P(X=4) $$

La distribuzione ipergeometrica permette di calcolare ciascuno di questi termini.

Non sviluppiamo qui tutto il calcolo perché il nostro obiettivo è fissare bene il significato di "esattamente", ma il modello è già pronto.

Tutta la distribuzione degli assi in una mano di cinque carte

Una mano di cinque carte può contenere:

0 assi
1 asso
2 assi
3 assi
4 assi

Per ciascun valore x possiamo usare:

$$ \binom{4}{x} \cdot \binom{48}{5-x} $$

Otteniamo il numero di mani:

0 assi -> 1.712.304
1 asso ->   778.320
2 assi ->   103.776
3 assi ->     4.512
4 assi ->        48

Se sommiamo:

1.712.304
+ 778.320
+ 103.776
+ 4.512
+ 48
=
2.598.960

ritroviamo esattamente:

$$ \binom{52}{5} $$

Questo è un controllo molto forte.

Le cinque categorie sono incompatibili tra loro e coprono tutte le possibili mani di cinque carte.

Di conseguenza anche le loro probabilità devono sommare a:

1

Il calcolo in C#

Lo standalone C# associato a questo articolo è:

EsattamenteDueAssi.cs

Possiamo riutilizzare l’algoritmo per le combinazioni sviluppato in precedenza, con una piccola ma importante estensione del contratto sui casi limite.

La funzione combinatoria introduttiva trattava k < 0 o k > n come un errore di chiamata. Nelle distribuzioni di probabilità è invece utile adottare la convenzione estesa:

C(n,k) = 0    se k < 0 oppure k > n, con n >= 0

Il significato è naturale: non esistono modi di scegliere un numero impossibile di elementi. Questo permette alla formula ipergeometrica di restituire direttamente probabilità zero ai bordi della distribuzione, senza aggiungere casi speciali. Un valore n < 0 resta invece un parametro strutturalmente invalido e continua a generare un'eccezione.

using System.Numerics;

static BigInteger Combinazioni(int n, int k)
{
    if (n < 0)
        throw new ArgumentOutOfRangeException(nameof(n));

    if (k < 0 || k > n)
        return BigInteger.Zero;

    k = Math.Min(k, n - k);

    BigInteger risultato = BigInteger.One;

    for (int i = 1; i <= k; i++)
    {
        risultato *= n - k + i;
        risultato /= i;
    }

    return risultato;
}

Ora il conteggio favorevole diventa quasi una trascrizione della formula:

BigInteger favorevoli =
    Combinazioni(4, 2)
    * Combinazioni(48, 3);

BigInteger totali =
    Combinazioni(52, 5);

double probabilita =
    (double)favorevoli / (double)totali;

Console.WriteLine($"Favorevoli: {favorevoli}");
Console.WriteLine($"Totali:     {totali}");
Console.WriteLine($"P:          {probabilita:P6}");

Otteniamo:

Favorevoli: 103776
Totali:     2598960
P:          3,992982%

Una funzione ipergeometrica generale

Possiamo rendere il codice riutilizzabile.

static double Ipergeometrica(
    int popolazione,
    int successiPopolazione,
    int estrazioni,
    int successiEstratti)
{
    if (popolazione < 0)
        throw new ArgumentOutOfRangeException(nameof(popolazione));

    if (successiPopolazione < 0 ||
        successiPopolazione > popolazione)
    {
        throw new ArgumentOutOfRangeException(
            nameof(successiPopolazione));
    }

    if (estrazioni < 0 || estrazioni > popolazione)
        throw new ArgumentOutOfRangeException(nameof(estrazioni));

    BigInteger favorevoli =
        Combinazioni(
            successiPopolazione,
            successiEstratti)
        *
        Combinazioni(
            popolazione - successiPopolazione,
            estrazioni - successiEstratti);

    BigInteger totali =
        Combinazioni(
            popolazione,
            estrazioni);

    return (double)favorevoli / (double)totali;
}

Notiamo che successiEstratti non viene rifiutato quando cade fuori dal supporto possibile, cioè dall'insieme dei valori che la variabile può realmente assumere con probabilità positiva. È intenzionale: in un modello valido, chiedere un numero impossibile di successi deve produrre probabilità zero, e la convenzione adottata per Combinazioni gestisce direttamente questi casi.

Per il nostro caso:

double p = Ipergeometrica(
    popolazione: 52,
    successiPopolazione: 4,
    estrazioni: 5,
    successiEstratti: 2);

Console.WriteLine($"{p:P6}");

otteniamo ancora:

3,992982%

Verifichiamo l'intera distribuzione in C#

Possiamo anche calcolare tutti i possibili numeri di assi:

double somma = 0.0;

for (int assi = 0; assi <= 4; assi++)
{
    double p = Ipergeometrica(
        52,
        4,
        5,
        assi);

    somma += p;

    Console.WriteLine(
        $"{assi} assi -> {p:P6}");
}

Console.WriteLine($"Somma: {somma:F12}");

La somma sarà molto vicina a:

1

L'eventuale differenza nelle ultime cifre deriva soltanto dalla rappresentazione double.

I conteggi combinatori sottostanti, calcolati con BigInteger, restano esatti.

Una verifica ancora più forte: enumerare tutte le mani

Il numero di mani di cinque carte è:

2.598.960

È molto più grande dei 7.776 esiti dei cinque dadi, ma è ancora abbastanza piccolo da poter essere enumerato da un programma moderno.

Possiamo numerare le carte da 0 a 51 e considerare:

0,1,2,3

come i quattro assi.

Poi generiamo tutte le combinazioni di cinque indici:

int favorevoli = 0;
int totali = 0;

for (int a = 0; a < 48; a++)
for (int b = a + 1; b < 49; b++)
for (int c = b + 1; c < 50; c++)
for (int d = c + 1; d < 51; d++)
for (int e = d + 1; e < 52; e++)
{
    totali++;

    int assi = 0;

    if (a < 4) assi++;
    if (b < 4) assi++;
    if (c < 4) assi++;
    if (d < 4) assi++;
    if (e < 4) assi++;

    if (assi == 2)
        favorevoli++;
}

Alla fine otteniamo:

Totali:     2.598.960
Favorevoli:   103.776

esattamente come previsto dalla formula.

Anche qui non si tratta di Monte Carlo: stiamo visitando tutte le mani possibili una volta ciascuna.

Quando usare formula ed enumerazione

Con 2,6 milioni di mani l'enumerazione è ancora praticabile come verifica.

Ma non è il modo migliore per capire il problema.

La formula:

$$ \binom{4}{2} \cdot \binom{48}{3} $$

spiega immediatamente la struttura dell'evento.

L'enumerazione conferma che il conteggio è corretto.

Questo schema continuerà a essere utile nella serie:

prima comprendere e contare
poi, quando possibile, verificare computazionalmente

Il punto pratico

La probabilità di avere esattamente due assi in cinque carte nasce da tre conteggi molto semplici:

scegli 2 assi:
C(4,2)

scegli 3 non assi:
C(48,3)

scegli una mano qualunque:
C(52,5)

Quindi:

P(esattamente 2 assi)
=
C(4,2) · C(48,3)
------------------
C(52,5)

ossia:

P
=
103.776 / 2.598.960
=
2162 / 54145
≈
3,993%

La distribuzione ipergeometrica non è altro che la generalizzazione di questo ragionamento a una popolazione finita contenente successi e insuccessi, dalla quale estraiamo senza reinserimento.

Nel prossimo articolo cambieremo una condizione fondamentale.

Invece di pescare carte da una popolazione che si modifica, lanceremo un dado dieci volte. Ogni prova ripartirà nelle stesse condizioni.

Chiederemo la probabilità di ottenere esattamente tre 6 e vedremo nascere, passo dopo passo, la distribuzione binomiale.