Generatore di Numeri Casuali
Imposta un intervallo e una quantità — ogni numero viene generato con una sorgente casuale crittograficamente sicura e senza bias, tutto nel tuo browser.
Casualità senza bias, non solo "abbastanza casuale"
Questo generatore attinge da crypto.getRandomValues(),
una sorgente casuale crittograficamente sicura — non
Math.random(), che è veloce ma pensata per animazioni
e giochi, non per qualcosa in cui l'equità del risultato conta
davvero. Ottenere una sorgente sicura è solo metà del lavoro:
trasformare un valore casuale grezzo a 32 bit in un numero dentro
l'intervallo scelto senza introdurre bias richiede un passaggio in
più, chiamato campionamento a rifiuto.
L'approccio ingenuo — valoreCasuale % intervallo —
favorisce molto leggermente l'estremo inferiore dell'intervallo
ogni volta che 2³² non si divide esattamente per la dimensione di
quell'intervallo. Questo strumento calcola invece il più grande
multiplo del tuo intervallo che rientra sotto 2³², e scarta (e
ripete) qualsiasi valore grezzo che cada sopra quella soglia, così
ogni numero nell'intervallo viene raggiunto da esattamente lo
stesso numero di possibili estrazioni grezze — nessuna eccezione,
nessun bias, per qualsiasi intervallo tu scelga.
Esempio pratico
Lancia un dado: minimo 1, massimo 6, quindi l'intervallo copre 6
numeri. 2³² è 4.294.967.296, e 4.294.967.296 ÷ 6 lascia un resto
di 4 — quindi il più grande multiplo di 6 che rientra è
4.294.967.292. Qualsiasi estrazione grezza che cada nei 4 valori
più alti (da 4.294.967.292 a 4.294.967.295) viene scartata e
ripetuta; ogni altra estrazione viene ridotta con % 6
e spostata di 1 per cadere tra 1 e 6. Il tasso di scarto qui è
circa lo 0,00000009% delle estrazioni — in pratica non vedrai
praticamente mai avvenire una nuova estrazione, ma la garanzia
vale per ogni intervallo, compresi quelli abbastanza piccoli da
far distorcere visibilmente i risultati a un modulo ingenuo.
Con "Consenti duplicati" deselezionato — scegliendo 6 numeri unici tra 1 e 49, come una schedina del lotto — lo strumento estrae i numeri nello stesso modo senza bias e mantiene un insieme in corso, ripetendo l'estrazione a ogni ripetizione, finché non ha 6 valori distinti. Chiedi più numeri unici di quanti l'intervallo possa fornire — ad esempio, 20 unici da un intervallo di soli 10 — e vedrai un errore chiaro invece di un fallimento silenzioso: "Impossibile generare 20 numeri unici tra 1 e 10 — quell'intervallo ha solo 10 numeri tra cui scegliere."
Domande frequenti
Perché crypto.getRandomValues invece di Math.random?
Math.random() è un algoritmo pseudocasuale veloce e prevedibile, pensato per cose come animazioni e giochi — non è crittograficamente sicuro, e in alcuni motori del browser il suo stato interno può essere ricostruito da una manciata di output. crypto.getRandomValues() attinge dalla sorgente di numeri casuali crittograficamente sicura del sistema operativo, la stessa usata per generare chiavi di cifratura. Per un generatore di numeri pensato per qualcosa che conta davvero — un'estrazione, un gioco, un campionamento — quella è la sorgente onesta su cui costruire, lo standard che questa piattaforma applica a ogni suo generatore.
Cos'è il bias di modulo, e come lo evita il campionamento a rifiuto?
Il modo ingenuo per trasformare un numero casuale a 32 bit in, ad esempio, il lancio di un dado, è `valoreCasuale % 6`. Questo introduce un bias ogni volta che l'intervallo della sorgente casuale non si divide esattamente per il tuo intervallo obiettivo — alcuni resti finiscono per essere leggermente più probabili di altri. Con una sorgente a 32 bit (4.294.967.296 valori possibili) e un intervallo piccolo come 1–6, quel bias è astronomicamente minuscolo, ma non è zero, e con sorgenti più piccole (come un singolo byte, 0–255) diventa abbastanza grande da distorcere davvero i risultati. Il campionamento a rifiuto lo elimina del tutto: questo strumento calcola il più grande multiplo del tuo intervallo che rientra in 32 bit, scarta qualsiasi estrazione grezza che cada sopra quella soglia, e mantiene solo le estrazioni che si distribuiscono in modo esattamente uniforme. Il tasso di scarto è minuscolo (vedi l'esempio pratico), quindi non costa nulla in pratica pur garantendo zero bias, per qualsiasi intervallo.
Lo stesso numero può ripetersi?
Dipende dalla casella 'Consenti duplicati'. Selezionata (l'opzione predefinita) significa che ogni numero viene estratto in modo indipendente, quindi le ripetizioni sono possibili e, per intervalli piccoli, probabili. Deselezionandola si passa a un campionamento senza reinserimento — lo strumento continua a estrarre finché non ha quel numero di valori distinti, poi si ferma. Se chiedi più numeri unici di quanti l'intervallo ne contenga davvero — ad esempio, 20 numeri unici tra 1 e 10 — non ci sono abbastanza valori distinti per soddisfare la richiesta, e lo strumento te lo segnala invece di bloccarsi o restituire silenziosamente meno numeri di quanti richiesti.
Quanto può essere grande l'intervallo o il lotto?
Minimo e massimo possono essere qualsiasi numero intero, positivo o negativo, finché l'ampiezza tra loro (massimo − minimo + 1) resta sotto circa 4,29 miliardi — la dimensione della sorgente casuale a 32 bit usata da questo strumento, più che sufficiente per ogni caso realistico, dal lancio di una moneta a un intervallo di svariati miliardi. La quantità è limitata a 1000 numeri per lotto, come gli altri generatori in blocco di questa piattaforma, ed è istantaneo in entrambi i casi perché ogni estrazione richiede raramente più di un tentativo.