SUPERCAT.DEV

Benvenut* sul mio blog

MATH

15 - Calcolare davvero le probabilità delle mani di poker

26-08-2026

Probabilità e combinatoria nei giochi

Una delle applicazioni più note della combinatoria è il calcolo delle probabilità delle mani di poker.

Spesso si trovano percentuali già pronte:

coppia
doppia coppia
tris
scala
colore
full
poker
scala colore

ma limitarsi a memorizzarle significa perdere la parte più interessante.

Con gli strumenti costruiti negli articoli precedenti possiamo derivarle tutte, capire perché i conteggi funzionano e poi verificarli con un programma C# che enumera ogni possibile mano di cinque carte.

Useremo un mazzo standard da 52 carte senza jolly e mani di cinque carte nelle quali l'ordine non conta.

Il denominatore comune

Il numero totale di mani di cinque carte è:

C(52,5)
=
2.598.960

Questo sarà il denominatore di tutte le probabilità.

Ogni categoria richiederà quindi la stessa struttura:

P(categoria)
=
numero di mani della categoria
-------------------------------
2.598.960

Il vero lavoro consiste nel costruire correttamente il numeratore.

Le categorie devono essere mutuamente esclusive

Per evitare doppi conteggi useremo categorie standard che non si sovrappongono.

In particolare:

scala colore

comprende anche le quattro scale reali.

La categoria:

colore

indicherà un colore che non sia anche scala colore.

La categoria:

scala

indicherà una scala che non sia anche colore.

La scala reale verrà comunque calcolata separatamente come sottoinsieme interessante, ma non sarà sommata una seconda volta nel totale.

Con questa convenzione ogni mano appartiene a una e una sola categoria.

Scala colore

Una scala di cinque carte può avere dieci sequenze di valori:

A 2 3 4 5
2 3 4 5 6
3 4 5 6 7
...
9 10 J Q K
10 J Q K A

L'asso può quindi essere basso nella sequenza:

A 2 3 4 5

oppure alto nella:

10 J Q K A

Per ogni sequenza possiamo scegliere uno dei quattro semi.

Quindi:

10 · 4
=
40

mani di scala colore.

La probabilità è:

40 / 2.598.960
≈
0,001539%

Dentro queste 40 mani ci sono le quattro scale reali:

10 J Q K A

una per seme.

Quindi:

P(scala reale)
=
4 / 2.598.960
=
1 / 649.740
≈
0,0001539%

La scala reale è una sotto-categoria della scala colore, non una categoria aggiuntiva da sommare al totale.

Poker

Per un poker dobbiamo scegliere il valore delle quattro carte uguali.

Abbiamo:

13

possibili valori.

Una volta scelto il valore del poker, tutte e quattro le carte di quel valore sono obbligatorie.

Per la quinta carta, il kicker, possiamo scegliere una qualunque delle altre:

52 - 4
=
48

carte.

Quindi:

13 · 48
=
624

mani di poker.

La probabilità è:

624 / 2.598.960
≈
0,024010%

Full

Un full contiene:

un tris
+
una coppia

Prima scegliamo il valore del tris:

13 modi

Poi scegliamo tre dei quattro semi disponibili per quel valore:

C(4,3)
=
4

Per la coppia dobbiamo scegliere un valore diverso:

12 modi

e due dei suoi quattro semi:

C(4,2)
=
6

Quindi:

13
·
C(4,3)
·
12
·
C(4,2)

ossia:

13 · 4 · 12 · 6
=
3.744

full.

La probabilità è:

3.744 / 2.598.960
≈
0,144058%

Colore

Un colore contiene cinque carte dello stesso seme.

Scegliamo il seme:

4 modi

e poi cinque valori tra i tredici disponibili:

C(13,5)
=
1.287

Questo produce:

4 · 1.287
=
5.148

mani dello stesso seme.

Ma tra queste sono comprese anche le:

40

scale colore.

Se vogliamo una categoria "colore" mutuamente esclusiva dalla scala colore dobbiamo sottrarle:

5.148 - 40
=
5.108

Quindi:

P(colore)
=
5.108 / 2.598.960
≈
0,196540%

Questo è un esempio diretto di inclusione-esclusione applicata alla classificazione delle mani.

Scala

Una scala può avere dieci sequenze di valori.

Per ciascuno dei cinque valori possiamo scegliere liberamente uno dei quattro semi:

4^5
=
1.024

Quindi inizialmente abbiamo:

10 · 4^5
=
10.240

mani con valori consecutivi.

Ma tra queste ci sono le 40 scale colore, che devono appartenere alla categoria superiore.

Quindi:

10.240 - 40
=
10.200

scale non colore.

La probabilità è:

10.200 / 2.598.960
≈
0,392465%

Tris

Per un tris scegliamo il valore triplo:

13 modi

Poi tre dei quattro semi:

C(4,3)
=
4

Le altre due carte devono avere valori:

diversi dal tris

e:

diversi tra loro

altrimenti produrremmo un full.

Scegliamo quindi due valori tra i dodici rimanenti:

C(12,2)
=
66

Per ciascuno dei due valori scegliamo uno dei quattro semi:

4^2
=
16

Quindi:

13
·
C(4,3)
·
C(12,2)
·
4^2

ossia:

13 · 4 · 66 · 16
=
54.912

mani di tris.

La probabilità è:

54.912 / 2.598.960
≈
2,112845%

Doppia coppia

Per una doppia coppia dobbiamo prima scegliere i due valori che formeranno le coppie:

C(13,2)
=
78

Per ciascun valore scegliamo due semi tra quattro:

$$ \binom{4}{2} $$

quindi:

C(4,2)^2
=
36

possibilità per costruire le due coppie.

Rimane il kicker.

Il suo valore deve essere diverso dai due già usati:

11

possibili valori.

Per quel valore possiamo scegliere uno dei quattro semi:

4

Quindi:

C(13,2)
·
C(4,2)^2
·
11
·
4

ossia:

78 · 36 · 44
=
123.552

mani di doppia coppia.

La probabilità è:

123.552 / 2.598.960
≈
4,753902%

Una coppia

Per una sola coppia scegliamo il valore della coppia:

13 modi

e due dei quattro semi:

C(4,2)
=
6

Le altre tre carte devono avere tre valori:

diversi dal valore della coppia

e:

tutti diversi tra loro

altrimenti avremmo doppia coppia, tris, full o poker.

Scegliamo quindi tre valori tra i dodici rimasti:

C(12,3)
=
220

Per ciascuno scegliamo uno dei quattro semi:

4^3
=
64

Il conteggio è:

13
·
C(4,2)
·
C(12,3)
·
4^3

ossia:

13 · 6 · 220 · 64
=
1.098.240

mani con una coppia.

La probabilità è:

1.098.240 / 2.598.960
≈
42,256903%

Carta alta

La categoria "carta alta" richiede più attenzione.

Dobbiamo avere:

cinque valori distinti

che non formino una scala e i semi non devono formare un colore.

Prima scegliamo cinque valori tra tredici:

C(13,5)
=
1.287

Ma dieci insiemi di valori formano una scala.

Quindi gli insiemi di valori ammessi sono:

1.287 - 10
=
1.277

Per ciascun insieme di cinque valori possiamo assegnare i semi in:

4^5
=
1.024

modi.

Tra questi, quattro assegnazioni mettono tutte le carte nello stesso seme:

tutti cuori
tutti quadri
tutti fiori
tutti picche

e sarebbero colori.

Quindi le assegnazioni di semi ammesse sono:

4^5 - 4
=
1.020

Il conteggio finale è:

$$ \begin{gathered} (\binom{13}{5}-10) \ \cdot \ (4^5-4) \end{gathered} $$

ossia:

1.277 · 1.020
=
1.302.540

mani di carta alta.

La probabilità è:

1.302.540 / 2.598.960
≈
50,117739%

È quindi la singola categoria più frequente.

Controllo fondamentale: la somma deve tornare

Le categorie mutuamente esclusive che abbiamo contato sono:

Categoria Mani Probabilità
Scala colore 40 $\approx 0{,}001539%$
Poker 624 $\approx 0{,}024010%$
Full 3.744 $\approx 0{,}144058%$
Colore 5.108 $\approx 0{,}196540%$
Scala 10.200 $\approx 0{,}392465%$
Tris 54.912 $\approx 2{,}112845%$
Doppia coppia 123.552 $\approx 4{,}753902%$
Coppia 1.098.240 $\approx 42{,}256903%$
Carta alta 1.302.540 $\approx 50{,}117739%$
Totale 2.598.960 $100%$

Sommandole:

40
+ 624
+ 3.744
+ 5.108
+ 10.200
+ 54.912
+ 123.552
+ 1.098.240
+ 1.302.540
=
2.598.960

esattamente:

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

Questo controllo è essenziale.

Se la somma fosse diversa, significherebbe che abbiamo:

dimenticato alcune mani

oppure:

contato due volte alcune categorie

Le probabilità principali

Dividendo ogni conteggio per:

2.598.960

otteniamo:

Le probabilità sono già riportate nella tabella precedente insieme ai conteggi, così il confronto tra frequenza assoluta e probabilità resta nello stesso punto.

La scala reale, ricordiamolo, è un sottoinsieme della scala colore:

4 mani
≈
0,0001539%

Perché l'asso basso va gestito esplicitamente

Quando programmeremo il classificatore dovremo considerare:

A 2 3 4 5

come scala.

Se rappresentiamo l'asso soltanto come valore:

14

la sequenza numerica:

14, 2, 3, 4, 5

non appare consecutiva.

Il classificatore deve quindi gestire esplicitamente il caso "wheel":

A 2 3 4 5

oltre alle normali sequenze consecutive.

È un esempio utile di differenza tra la semplicità di una formula matematica e i dettagli necessari in un'implementazione corretta.

Verifica con C#: enumeriamo tutte le mani

Lo standalone C# associato a questo articolo è:

ProbabilitaManiPoker.cs

Il numero totale:

2.598.960

è abbastanza piccolo da permettere un'enumerazione completa.

Non abbiamo bisogno di Monte Carlo.

Possiamo costruire un mazzo di 52 carte e generare tutte le combinazioni:

$$ a < b < c < d < e $$

In questo modo ogni mano viene visitata una sola volta.

Il classificatore assegna poi la mano a una delle nove categorie.

Rappresentiamo le carte

readonly record struct Carta(
    int Valore,
    int Seme);

Useremo:

Valore:
2 ... 14

con:

14 = Asso

e:

Seme:
0 ... 3

Il seme non ha bisogno di un significato particolare per il classificatore: ci basta sapere se cinque carte hanno lo stesso valore di Seme.

Classificare una mano

Possiamo contare quante volte compare ogni valore e ogni seme.

Una mano è:

scala colore

se è contemporaneamente scala e colore.

Poi controlliamo, in ordine:

poker
full
colore
scala
tris
doppia coppia
coppia
carta alta

L'ordine è importante.

Se controllassimo prima:

colore

una scala colore verrebbe classificata troppo presto come semplice colore.

Se controllassimo:

tris

prima del full, una mano con 3+2 potrebbe essere etichettata soltanto come tris.

La classificazione deve quindi rispettare la gerarchia delle categorie.

Un classificatore C#

Il file di esempio allegato contiene il classificatore completo.

La logica centrale può essere riassunta così:

if (scala && colore)
    return CategoriaMano.ScalaColore;

if (poker)
    return CategoriaMano.Poker;

if (tris && coppia)
    return CategoriaMano.Full;

if (colore)
    return CategoriaMano.Colore;

if (scala)
    return CategoriaMano.Scala;

if (tris)
    return CategoriaMano.Tris;

if (numeroCoppie == 2)
    return CategoriaMano.DoppiaCoppia;

if (numeroCoppie == 1)
    return CategoriaMano.Coppia;

return CategoriaMano.CartaAlta;

Enumerazione completa

Generiamo il mazzo:

var mazzo = new List<Carta>();

for (int valore = 2; valore <= 14; valore++)
{
    for (int seme = 0; seme < 4; seme++)
    {
        mazzo.Add(
            new Carta(
                valore,
                seme));
    }
}

Poi enumeriamo ogni combinazione di cinque indici:

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++)
{
    // classifica la mano
}

Il totale deve essere:

2.598.960

I conteggi attesi dal programma

Se il classificatore è corretto, l'enumerazione deve produrre esattamente:

ScalaColore  = 40
Poker        = 624
Full         = 3.744
Colore       = 5.108
Scala        = 10.200
Tris         = 54.912
DoppiaCoppia = 123.552
Coppia       = 1.098.240
CartaAlta    = 1.302.540

e:

Totale
=
2.598.960

Possiamo contare anche le scale reali separatamente come controllo:

Scala reale
=
4

ma senza sottrarle o aggiungerle di nuovo alle categorie principali.

Formula ed enumerazione si controllano a vicenda

A questo punto abbiamo due percorsi completamente indipendenti.

Il primo usa formule combinatorie:

C(13,2)
C(4,2)
4^3
...

Il secondo visita realmente tutte le mani e le classifica.

Se entrambi producono gli stessi nove conteggi e la somma vale C(52,5), abbiamo una verifica molto forte.

Non stiamo usando una simulazione statistica.

Stiamo confrontando:

calcolo esatto

con:

enumerazione esatta

Perché Monte Carlo qui sarebbe una scelta peggiore

Potremmo simulare milioni di mani casuali e stimare le frequenze.

Per categorie comuni come:

coppia

la stima convergerebbe abbastanza rapidamente.

Ma per una scala colore, che compare soltanto in:

40

mani su oltre 2,5 milioni, la stima sarebbe molto più rumorosa.

E soprattutto non ne abbiamo bisogno.

Lo spazio completo è abbastanza piccolo da poter essere contato direttamente.

Monte Carlo diventa interessante quando l'enumerazione esatta è troppo costosa o quando il modello diventa più complesso.

Questo sarà particolarmente rilevante quando passeremo a giochi con carte comuni, decisioni e stati intermedi.

Il punto pratico

Le probabilità delle mani di poker non sono una lista di numeri da memorizzare.

Derivano tutte dalla stessa struttura:

P(categoria)
=
mani favorevoli
---------------
C(52,5)

Il denominatore è sempre:

C(52,5)
=
2.598.960

e il numeratore nasce traducendo con precisione la definizione della categoria in scelte combinatorie.

Il controllo finale:

40
+ 624
+ 3.744
+ 5.108
+ 10.200
+ 54.912
+ 123.552
+ 1.098.240
+ 1.302.540
=
2.598.960

dimostra che le categorie utilizzate coprono tutto lo spazio senza sovrapporsi.

Il programma C# può poi enumerare tutte le mani e verificare gli stessi conteggi uno per uno.

Nel prossimo articolo passeremo al Texas Hold'em.

Lì il problema non sarà più classificare una mano completa già nota, ma aggiornare le probabilità quando conosciamo alcune carte e ne devono ancora arrivare altre.

Partiremo dal concetto pratico di out, distinguendo il calcolo esatto della probabilità al turn, al river e entro il river dalle scorciatoie approssimate usate spesso al tavolo.