Come funziona un generatore di numeri casuali (e pseudo­casuali)

Un computer è una macchina che esegue le istruzioni alla lettera. E allora come fa a lanciare una moneta, tirare un dado o estrarre un nome a caso? In breve: quasi sempre non produce affatto numeri davvero casuali. Produce numeri che sembrano soltanto casuali, e per la maggior parte degli usi va bene così. Ecco come funziona un generatore di numeri casuali, dove può sbagliare e come gli strumenti di questo sito scelgono i loro risultati.

Due tipi di casualità

  • I numeri davvero casuali vengono da qualcosa di fisico che nessuno può prevedere: il rumore elettrico in un circuito, il decadimento radioattivo, le scariche radio dell’atmosfera. Random.org, per esempio, usa il rumore atmosferico.
  • I numeri pseudocasuali vengono da una formula. Si parte da un numero chiamato seme, lo si fa passare nella formula e si ottiene il numero successivo, poi quello dopo ancora. Il risultato sembra casuale, ma lo stesso seme dà sempre la stessa sequenza.

Lo pseudocasuale sembra un imbroglio, ma è quello che usano quasi tutti i giochi, le app e le simulazioni. È veloce, e una buona formula supera gli stessi test statistici che supera la vera casualità.

Il primo metodo al computer e il suo difetto

Intorno al 1949 il matematico John von Neumann propose il metodo del quadrato medio: si eleva un numero al quadrato, si prendono le cifre centrali e si ripete. Partendo da 1234, il quadrato è 01522756, quindi il numero successivo è 5227, poi 3215, 3362, 3030 e così via.

Sembra casuale, ma finisce in un ciclo. Partendo da 2916 si ottengono 5030, 3009, 0540, 2916, e poi gli stessi quattro numeri all’infinito. Von Neumann lo sapeva. Usava il metodo perché era veloce, e controllava i risultati per scovare eventuali problemi. Secondo una sua famosa battuta, chiunque cerchi di produrre numeri casuali con l’aritmetica si trova «in stato di peccato».

Prima dei computer: libri di numeri casuali

Gli scienziati avevano così bisogno di numeri casuali che li si stampava nei libri. Nel 1955 la RAND Corporation pubblicò A Million Random Digits with 100,000 Normal Deviates, ottenuto con una roulette elettronica. I ricercatori aprivano il libro a una pagina a caso e leggevano le cifre. Molto prima si usavano dadi, monete e sorteggi, come racconta il nostro articolo sull’oracolo dei dadi nell’antichità.

Come funzionano i generatori moderni

I generatori pseudocasuali di oggi sono molto migliori. Tra i più comuni:

  • Mersenne Twister: il generatore predefinito in Python e in molti altri strumenti. Si ripete solo dopo 219937 − 1 numeri, un numero di circa 6.000 cifre.
  • xorshift128+: il generatore dietro Math.random() in Chrome e negli altri browser basati sul motore V8. Velocissimo, va bene per giochi e animazioni.
  • Generatori crittografici: quelli usati per password e chiavi di cifratura. Il sistema operativo ci mescola eventi fisici imprevedibili, come minuscole differenze di tempo nell’hardware, così nemmeno chi conosce la formula può prevedere il numero successivo.

I generatori comuni vanno benissimo per un gioco. Ma se qualcuno vede abbastanza dei loro risultati, a volte può ricavare il resto. Per tutto ciò in cui contano l’equità o la sicurezza, la scelta giusta è il tipo crittografico.

Una trappola nascosta: il bias del modulo

Anche un generatore perfetto può dare risultati ingiusti se usato con poca attenzione. Supponiamo di avere un byte casuale, cioè un numero da 0 a 255, e di voler tirare un dado. Il modo più semplice è dividere per 6 e usare il resto. Ma 256 non è divisibile per 6, quindi quattro facce ottengono una possibilità in più:

Faccia del dado ricavata da un byte casuale (da 0 a 255) usando il resto della divisione per 6
FacciaProbabilità
1, 2, 3 o 443 su 256 ciascuna (16,8%)
5 o 642 su 256 ciascuna (16,4%)

La differenza è piccola, ma su migliaia di lanci si nota. Il rimedio è semplice: se il numero casuale cade nella parte avanzata che non si divide in modo uniforme, lo si scarta e se ne estrae un altro. Si chiama campionamento per rifiuto.

Come scelgono i nostri strumenti

I nostri strumenti Testa o croce, Lancia dadi, Numero casuale, Estrai nomi e gli altri che condividono lo stesso codice usano il generatore crittografico del tuo browser, chiamato crypto.getRandomValues. Applicano anche il campionamento per rifiuto, così ogni faccia, numero e nome ha esattamente la stessa probabilità. I browser più vecchi che non hanno questa funzione ripiegano su Math.random(). Tutto avviene nel tuo browser; sul nostro server non si decide nulla.

Ma allora è davvero casuale?

Per lanciare una moneta o tirare un dado, un buon generatore è meglio dell’oggetto vero. Le monete vere hanno una minima tendenza verso il lato da cui partono, come spiega il nostro articolo sulla probabilità di testa o croce, e i dadi veri possono essere leggermente irregolari. Un buon generatore non ha nessuno dei due problemi.

Il rischio maggiore è la persona che legge i risultati. Vediamo schemi nelle serie e ci aspettiamo che il risultato «mancante» debba ormai uscire. È la fallacia dello scommettitore, e inganna le persone molto più spesso di qualunque computer. Per vedere quanto siamo scarsi a inventare da soli numeri casuali, leggi «Possiamo essere casuali?».

Domande frequenti

Un computer può generare numeri davvero casuali?

Non con una formula da sola. Le formule danno numeri pseudocasuali che sembrano soltanto casuali. Per la vera casualità i computer misurano eventi fisici imprevedibili, come il rumore elettrico, e molti dispositivi hanno un hardware apposito.

Che cos’è il seme in un generatore di numeri casuali?

È il numero di partenza della formula. Lo stesso seme dà sempre la stessa sequenza, cosa utile per i test e per i giochi che permettono di condividere un mondo o un livello tramite il suo seme.

Math.random() è davvero casuale?

No. È un generatore pseudocasuale veloce, adatto ai giochi ma non a niente di segreto o dove ci sono di mezzo dei soldi. Per questo i browser offrono crypto.getRandomValues.

Testa o croce e dadi online sono equi?

Se fatti bene, sì. I nostri strumenti testa o croce e lancia dadi usano il generatore crittografico del browser con il campionamento per rifiuto, così ogni risultato ha esattamente la stessa probabilità.

Che cos’è il bias del modulo?

Una piccola ingiustizia che compare quando si comprime un numero casuale in un intervallo più piccolo usando il resto di una divisione e i conti non tornano in modo esatto. Il campionamento per rifiuto la elimina.

Potrebbe interessarti anche

Prova questi strumenti sì o no

✈️