Generatoredi Numeri

Come funziona la generazione di numeri casuali

Cosa rende un numero davvero casuale, come i computer li generano e perché la differenza tra pseudocasualità e vera casualità ha importanza pratica.

1. Cosa significa "numero casuale"?

Nel linguaggio comune, "casuale" e "arbitrario" vengono spesso usati come sinonimi, ma in matematica e informatica hanno significati precisi. Un numero è casuale quando il suo valore non può essere previsto prima che venga estratto. Perché questo avvenga, occorrono due condizioni: che ogni valore possibile abbia la stessa probabilità di uscire — si parla di distribuzione uniforme — e che un risultato non influenzi in alcun modo il successivo.

La distinzione con "arbitrario" è importante. Chi sceglie un numero "a caso" nella propria testa non sta producendo un numero casuale in senso statistico: la scelta è condizionata da bias psicologici, abitudini e preferenze inconsapevoli. I numeri attorno al 7 e al 37, per esempio, vengono scelti con una frequenza molto superiore alla loro probabilità statistica quando si chiede alle persone di indicare un numero "casuale" tra 1 e 100. I computer, per produrre vera casualità, hanno bisogno di fonti esterne di imprevedibilità.

2. Pseudocasualità vs vera casualità

Generatori pseudocasuali (PRNG)

La maggior parte dei generatori usati nei computer non è veramente casuale, ma pseudocasuale. Un generatore pseudocasuale — detto PRNG, dall'inglese Pseudorandom Number Generator — parte da un valore iniziale chiamato seed e applica una serie di operazioni matematiche per produrre una sequenza di numeri che sembra casuale. La sequenza è però deterministica: con lo stesso seed si ottiene sempre la stessa serie di numeri, il che non è necessariamente un problema. Per simulazioni, giochi e applicazioni non crittografiche, i PRNG sono più che sufficienti e offrono prestazioni molto elevate.

Generatori veramente casuali (TRNG)

I generatori veramente casuali — detti TRNG, True Random Number Generator — si basano invece su fenomeni fisici imprevedibili: il rumore termico di un componente elettronico, le fluttuazioni nella tensione elettrica, il ritardo tra i tasti premuti su una tastiera. Questi eventi fisici sono genuinamente imprevedibili e costituiscono fonti di vera casualità. Servizi come random.org usano il rumore atmosferico per generare numeri attraverso questo principio.

3. Algoritmi di generazione

Math.random() in JavaScript

Il metodo Math.random()è la funzione standard per generare numeri casuali nei browser. Restituisce un numero decimale compreso tra 0 (incluso) e 1 (escluso), e il risultato cambia a ogni chiamata in modo non prevedibile. Internamente, i browser moderni — Chrome, Firefox, Safari — usano l'algoritmo xorshift128+, che appartiene alla famiglia dei PRNG ed è veloce e statisticamente robusto per uso generale. Il seed iniziale viene ricavato da fonti di entropia del sistema operativo al momento del caricamento della pagina.

Crypto.getRandomValues()

Per applicazioni che richiedono sicurezza crittografica — generatori di password, token di autenticazione, chiavi di cifratura — Math.random() non è sufficiente. L'API Web Cryptography mette a disposizione Crypto.getRandomValues(), che attinge direttamente all'entropia del sistema operativo e produce numeri crittograficamente sicuri. Tutti i principali browser la supportano senza necessità di librerie esterne.

Mersenne Twister e altri algoritmi

Oltre a xorshift128+, esistono decine di algoritmi per la generazione pseudocasuale. Il Mersenne Twister (MT19937) è stato per anni lo standard per simulazioni scientifiche: ha un periodo di circa 219937 − 1, il che significa che la sua sequenza si ripete solo dopo un numero astronomico di valori. Più recenti sono gli algoritmi della famiglia PCG e ChaCha20, che offrono garanzie crittografiche migliori con prestazioni elevate.

4. Il ruolo dell'entropia

In informatica, l'entropia misura la quantità di imprevedibilità disponibile nel sistema. Il sistema operativo raccoglie continuamente entropia da fonti hardware: i movimenti del mouse, i tempi di risposta del disco, le interruzioni della rete, il rumore termico dei componenti. Su Linux e macOS questa entropia viene accumulata nel kernel e resa disponibile attraverso un'interfaccia da cui i programmi possono attingere numeri crittograficamente casuali.

Nei browser, il seed di Math.random() viene inizializzato con entropia proveniente dal sistema operativo al momento della creazione del contesto JavaScript. Crypto.getRandomValues() vi attinge direttamente a ogni chiamata, senza intermediari, e per questo è considerata crittograficamente sicura.

5. Come funziona nel browser

Tutti i generatori di numeri di questo sito funzionano interamente lato client, nel browser. Non inviano dati a nessun server e non richiedono un account. Il calcolo avviene nella scheda del browser dell'utente, con una delle due API descritte sopra a seconda del tipo di generatore. Per il generatore di password viene usata Crypto.getRandomValues(); per tutti gli altri, Math.random()con seed derivato dall'entropia del sistema.

Questo approccio garantisce che i risultati siano istantanei, privati e accessibili anche senza connessione a internet, una volta che la pagina è stata caricata. Non c'è nessuna comunicazione con server esterni e nessun log delle estrazioni.

6. Applicazioni pratiche

Sorteggi e lotterie

I generatori di numeri casuali sono indispensabili in qualsiasi contesto che richieda imparzialità: sorteggi per assegnare premi, estrazione dell'ordine di turni, selezione casuale di partecipanti a un evento. Un generatore digitale, se implementato correttamente, è più affidabile di un metodo manuale perché elimina i bias inconsapevoli del comportamento umano e garantisce una distribuzione uniforme verificabile.

Giochi da tavolo e GDR

I giochi di ruolo come Dungeons & Dragons usano dadi poliedrici — D4, D6, D8, D10, D12, D20 — per determinare l'esito di azioni e combattimenti. Un simulatore digitale è comodo quando si gioca online o non si hanno i dadi fisici a portata di mano. Lo stesso vale per giochi da tavolo che richiedono l'estrazione di carte, la definizione di un ordine di turno o l'assegnazione casuale di ruoli tra i giocatori.

Sicurezza informatica

Le password sicure, i token di sessione, le chiavi crittografiche per le connessioni HTTPS: tutti dipendono da generatori casuali robusti. La qualità della casualità è direttamente legata alla sicurezza del sistema e un generatore con entropia insufficiente o prevedibile può rendere le password indovinabili e le chiavi vulnerabili ad attacchi.

7. Numeri casuali nei giochi a premi

Le estrazioni ufficiali del Lotto, SuperEnalotto e 10eLotto in Italia avvengono con metodi regolamentati dall'Agenzia delle Dogane e dei Monopoli (ADM). Fino al 2009 si usavano urne con palline numerate; da allora sono stati introdotti sistemi informatici certificati e verificati da enti terzi, con procedure di audit pubbliche che garantiscono la conformità alle norme.

I generatori di numeri di questo sito non sono collegati in alcun modo alle estrazioni ufficiali. Sono strumenti per simulare combinazioni casuali — utili per decidere quali numeri giocare o per esercitarsi — ma i loro risultati non hanno alcun valore predittivo sulle estrazioni reali, che sono eventi completamente indipendenti da qualsiasi calcolo precedente.

8. Generazione casuale e sicurezza

Un generatore crittograficamente sicuro, detto CSPRNG (Cryptographically Secure Pseudorandom Number Generator), deve soddisfare due requisiti aggiuntivi rispetto a un PRNG ordinario. Il primo è che conoscere una parte della sequenza non deve permettere di calcolare i valori precedenti o successivi. Il secondo è che, anche se un attaccante conosce lo stato interno del generatore in un momento dato, non deve riuscire a ricostruire i valori prodotti prima.

Un generatore debole può compromettere l'intera catena di sicurezza di un sistema, e per questo nella crittografia moderna Math.random() non viene mai usato per generare segreti. Le librerie di sicurezza usano sempre API equivalenti a Crypto.getRandomValues(), che nel browser è disponibile senza dipendenze esterne.

9. Errori comuni sulla casualità

Il più diffuso è la fallacia del giocatore, nota anche come fallacia di Monte Carlo. Chi la commette crede che, se un certo risultato non è uscito per molti turni, sia "in ritardo" e quindi più probabile nelle prossime estrazioni. Questa convinzione è sbagliata: ogni estrazione è indipendente dalle precedenti e la probabilità di ogni numero rimane identica a ogni turno, indipendentemente da quante volte sia già uscito o non sia uscito.

L'opposto speculare è la hot hand fallacy: la convinzione che un giocatore o un generatore "in forma" continuerà a produrre buoni risultati. Anche in questo caso, la correlazione percepita tra eventi indipendenti è una proiezione psicologica, non un fatto statistico.

Un terzo errore comune è confondere distribuzione uniforme con distribuzione casuale su piccoli campioni. Un generatore corretto produrrà, su un numero molto grande di estrazioni, una distribuzione approssimativamente uniforme. Ma su piccoli campioni la varianza è alta e le concentrazioni sono normali, non sospette. Vedere tre volte lo stesso numero in dieci estrazioni non significa che il generatore sia difettoso: è esattamente quello che ci si aspetta dalla statistica.

Esplora tutti i nostri generatori di numeri casuali →