Non tutte le casualità sono uguali. La differenza tra un generatore di numeri pseudo-random e uno crittograficamente sicuro determina se la tua moneta flip, dadi rotolo, o sorteggio di nome è veramente equo — o tranquillamente prevedibile.
Un generatore di numeri casuali (RNG) è un algoritmo o un dispositivo hardware che produce una sequenza di numeri senza alcun modello discernibile. I computer affrontano un problema fondamentale: sono macchine deterministiche. Data lo stesso stato iniziale, una CPU produrrà sempre la stessa uscita. La vera casualità hardware richiede una fonte esterna di imprevedibilità — chiamata entropia — come il rumore termico, la variazione di temporizzazione del disco, o il movimento del mouse.
I RNG software risolvono questa soluzione raccogliendo l'entropia reale dal sistema operativo o utilizzando una formula matematica per simulare la casualità. Questi due approcci producono risultati molto diversi.
Un generatore di numeri pseudo-random (PRNG) inizia dallo stato interno e applica un algoritmo deterministico per produrre ogni numero successivo. L'output può sembrare casuale, ma lo stesso stato iniziale produce la stessa sequenza.
JavaScript's Math.random() utilizza un PRNG definito dall'implementazione. La specifica Javascript non richiede un particolare algoritmo e esplicitamente non rende l'output crittograficamente sicuro. È quindi inappropriato quando l'imprevedibilità o l'equità verificabile conta.
Per la maggior parte degli scopi — animazioni, mescolando una playlist, raccogliendo un colore di sfondo casuale — questo non importa. Ma per qualsiasi cosa dove l'equità è in gioco (giveaways, team draws, risultati di gioco), la prevedibilità è un problema reale.
Un generatore di numeri pseudo-random crittograficamente sicuro (CSPRNG) è progettato in modo che le uscite precedenti non rendono le uscite future praticamente prevedibili. Rispetto a un PRNG generico, fornisce proprietà necessarie per applicazioni sensibili alla sicurezza e sensibili alla correttezza:
I browser ottengono valori crittograficamente forti dalle strutture del sistema operativo. Le fonti esatte entropia e gli algoritmi sono dettagli della piattaforma, quindi le applicazioni web dovrebbero utilizzare l'API Web Crypto piuttosto che tentare di raccogliere o gestire entropia se stessi.
crypto.getRandomValues()I browser espongono la funzionalità CSPRNG attraverso l'API Web Crypto. La funzione chiave è crypto.getRandomValues(typedArray), che riempie un array digitato con byte crittograficamente casuali provenienti dalla piscina entropia del sistema operativo.
Per generare un integer imparziale in un intervallo, Randly legge un valore di 32 bit (o combina valori per gamme più ampie e sicure) e rifiuta la coda corta che altrimenti creerebbe bias modulo:
funzione casualeUint32() {
const array = nuovo Uint32Array(1);
crypto.getRandomValues(array);
[0];
}
funzione randomInt(min, max) {
const range = max - min + 1;
const limit = Math.floor(2 ** 32 / range) * range;
lasciare il valore;
do value = randomUint32(); mentre (valore >=limit);
ritorno min + (valore % range);
}
A Uint32Array fornisce 232 valori possibili; Randly combina 53 bit quando è necessario un range più ampio di sicurezza. Il campionamento di iniezione assicura che ogni uscita nell'intervallo richiesto corrisponda allo stesso numero di valori sorgente, quindi nessun risultato riceve una quota più grande semplicemente perché l'intervallo richiesto non divide uniformemente l'intervallo di origine.
Per la maggior parte degli usi casuali, la distinzione è invisibile. Ma consideri un insegnante di classe utilizzando un raccoglitore di nome per chiamare gli studenti, o un'organizzazione che esegue un sorteggio premio. Un PRNG generico non è specificato per l'uso avversario, mentre una piattaforma CSPRNG è progettata per mantenere i valori futuri imprevedibili. Un processo controllato è ancora appropriato per le estrazioni regolamentate o ad alto valore.
Ogni strumento su Randly — dadi rotoli, getti di monete, nomi, giri di ruota, generazione di colori — usi crypto.getRandomValues() esclusivamente. L'implementazione vive in un unico modulo condiviso (lib/random.ts) che le esportazioni funzioni digitate: casualeInt(min, max), randomIndex(lunghezza), randomElement(array)e shuffleArray(array).
Nessuna chiamata a Math.random() esiste in qualsiasi logica di strumento. L'unico posto che i valori standard di PRNG appaiono è nei parametri di animazione di Framer Motion (posizione di partenza degli elementi fluttuanti), che sono puramente cosmetici e non hanno effetto sui risultati degli strumenti.
"Cliccare più velocemente rende il risultato più casuale."
La sincronizzazione del clic non ha effetto quando si utilizza un CSPRNG. La piscina entropia è continuamente rinfrescata dal sistema operativo indipendentemente dall'interazione dell'utente.
"L'esecuzione dello stesso strumento due volte di fila dà risultati correlati".
Ogni chiamata a crypto.getRandomValues() è indipendente. Gli output precedenti non forniscono informazioni su quelli futuri.
"Una lista più lunga significa che qualcuno alla fine è meno probabile che sia scelto."
La selezione dell'indice casuale dà ad ogni posizione una probabilità pari a 1/n, indipendentemente dalla lunghezza dell'elenco.
Tutti gli strumenti Randly usano la casualità crittograficamente sicura. Nessuna registrazione richiesta.