Genera numeri decimali casuali uniformemente distribuiti nell'intervallo [0, 1]. Ogni valore ha la stessa probabilità di essere generato. Questi numeri sono la base per molte applicazioni statistiche, simulazioni Monte Carlo e algoritmi probabilistici.
Un numero decimale casuale nell'intervallo [0,1] è il mattone da cui, con una trasformazione, nasce quasi ogni altra distribuzione statistica. Questo generatore restituisce valori come 0,7391 o 0,04628 con la precisione che decidi tu, da una singola cifra fino a molte posizioni decimali. Torna utile a chi programma modelli Monte Carlo, studia probabilità o deve assegnare pesi e soglie senza distorsioni. La sorgente di casualità è crittografica, non un rand() con seed prevedibile.
Alla base c'è un generatore di interi crittograficamente sicuro (un CSPRNG, in PHP la funzione random_int). Il decimale nasce estraendo un intero uniforme e dividendolo per la potenza di dieci corrispondente alla precisione. Con 4 cifre, per esempio, si sorteggia un intero tra 0 e 10000 e lo si divide per 10000, ottenendo un valore in [0,1] a passi di 0,0001.
Questo approccio garantisce che ogni valore della griglia abbia la stessa probabilità di uscire: la distribuzione è uniforme, senza le derive o i cicli ripetuti tipici dei generatori pseudocasuali con seed indovinabile. La precisione decimale è il parametro chiave, perché definisce la granularità dei valori estraibili.
Un dettaglio matematico va tenuto presente: aumentare le cifre non elimina la natura discreta del risultato. Anche con 10 decimali stai campionando da un insieme finito, seppure enorme, di valori equispaziati. Per la stragrande maggioranza degli usi pratici la differenza rispetto a un decimale continuo è del tutto irrilevante.
Il valore in [0,1] alimenta ogni iterazione Monte Carlo: serve a stimare pi greco, integrali difficili o il rischio di un portafoglio, ripetendo l'estrazione migliaia di volte e mediando i risultati.
Per simulare un evento che accade il 30% delle volte basta estrarre un decimale e verificare se è minore di 0,3. È il modo più pulito per far scattare un ramo di test A/B o l'aggancio di un nemico in un videogioco.
Assegnare pesi casuali ai nodi di una rete, mescolare le priorità di una coda o estrarre un campione con probabilità variabile: il valore uniforme è la materia prima ideale per tutte queste operazioni.
In fisica e machine learning capita di dover iniettare piccole perturbazioni. Da un decimale in [0,1] si costruisce facilmente rumore controllato, ad esempio per inizializzare i pesi di una rete neurale prima dell'addestramento.
Loot drop, colpi critici, generazione procedurale di mappe: quasi ogni sistema aleatorio di un gioco riduce la sua logica al confronto di un numero tra 0 e 1 con una soglia.
Con il metodo della trasformata inversa un valore uniforme diventa esponenziale, normale o di Poisson. Per esempio -ln(u)/lambda genera tempi di attesa esponenziali, utili in teoria delle code e affidabilità.
Quasi tutti i linguaggi offrono una funzione che restituisce un decimale in [0,1): Math.random() in JavaScript, random() in Python, drand48 nel mondo C. Non è una scelta arbitraria. L'intervallo unitario è il punto di partenza universale perché qualsiasi altra distribuzione si costruisce da lì con una trasformazione.
Il ponte matematico si chiama metodo della trasformata inversa. Se hai un valore uniforme u in [0,1] e conosci la funzione di ripartizione inversa di una distribuzione, applicandola a u ottieni un campione di quella distribuzione. Così da un semplice decimale nascono tempi esponenziali, valori gaussiani (via Box-Muller) o estrazioni discrete con probabilità arbitrarie.
Riscalare è altrettanto immediato: per un numero in [a, b] basta calcolare a + u*(b-a). Per un intero da 1 a 6, come un dado, si moltiplica per 6 e si prende la parte intera più uno. Questo rende il decimale in [0,1] più flessibile di un generatore vincolato a un intervallo fisso, perché la trasformazione la governi tu.
Dipende dalla convenzione. Molte librerie usano [0,1), quindi lo zero è incluso ma l'uno no, proprio per evitare problemi in formule come divisioni o logaritmi. Con precisione finita, comunque, la probabilità di ottenere esattamente 1,0 è minima e nella pratica quasi sempre trascurabile.
Per la maggior parte degli usi da 4 a 6 cifre sono più che sufficienti e restituiscono valori leggibili come 0,7391. Aumenta la precisione solo se il tuo modello è sensibile a differenze minime, ad esempio in simulazioni fisiche ad alta risoluzione. Oltre le 15-16 cifre entri comunque nei limiti della rappresentazione a virgola mobile.
La sorgente è un CSPRNG, quindi la qualità statistica è alta e i valori non sono prevedibili. Per chiavi o token di sicurezza, però, conviene generare direttamente byte casuali con strumenti dedicati anziché passare da un decimale formattato, che introduce arrotondamenti e riduce l'entropia effettiva.
Un PRNG con seed produce sequenze deterministiche: dato lo stesso seme ripete gli stessi numeri, cosa utile per test riproducibili ma vulnerabile se il seme è indovinabile. Il CSPRNG usato qui è progettato per resistere alla predizione e non mostra i cicli o le correlazioni dei generatori più semplici.
Applica la formula 10 + u*40, dove u è il decimale estratto. Se u vale 0,25 ottieni 20; se vale 0,9 ottieni 46. È la riscalatura lineare standard e funziona per qualsiasi intervallo [a, b] con a + u*(b-a).
Uniforme significa che ogni valore della griglia ha esattamente la stessa probabilità di uscire, senza zone più dense o più rare. In un istogramma di molte estrazioni le barre risultano tutte pressoché alla stessa altezza, a differenza di una distribuzione a campana in cui i valori centrali sono più frequenti.