La risposta di Dave la riprende abbastanza bene, ma per chiarire un po 'di più la seconda opzione:
un vero generatore di numeri casuali hardware utilizza una fonte di entropia fisica. Una tale fonte di entropia potrebbe essere radiazione cosmica, rumore elettrico, effetto avanlanche da un diodo polarizzato inverso (o transistor BJT), circuito chua, ecc. Meno deterministica è la fonte di entropia, migliore è la qualità dell'uscita casuale. Una fonte di entropia ideale sarebbe quella di utilizzare un effetto di fisica quantistica, o qualcosa che non può essere modellato con equazioni deterministiche.
Un altro fattore importante con generatori di numeri casuali è che la fonte di entropia può generare solo una quantità limitata di entropia per unità di tempo. Un buon esempio è il circuito chua: sebbene sia abbastanza casuale, ha una velocità molto scarsa e non può essere usato per applicazioni nella vita reale.
In molti processori / microcontrollori con RNG integrati, viene utilizzato l'orologio da 2 a 4 orologi che sono deliberatamente erroneamente sincronizzati. Quindi, usano entrambi i filtri analogici e digitali per randomizzare ancora di più lo schema e spostare il risultato in un registro. L'esecuzione di tale filtro richiede alcuni cicli, il che spiega la quantità minima di cicli richiesta su un determinato orologio prima che sia disponibile il valore più recente.
L'orologio alla deriva non è un effetto quantico, quindi potrebbe essere modellato, ma è abbastanza casuale, perché dipende da molti parametri, come temperatura, processo al silicio, frequenza di funzionamento, rumore elettrico, radiazioni di fondo, ecc. .
Nelle applicazioni in cui l'RNG hardware non ha un throughput sufficiente (come nelle applicazioni crittografiche molto impegnative), è abbastanza comune utilizzare l'RNG hardware come seed per un generatore di numeri pseudo casuali come la funzione rand () nello sdtlib. Tuttavia, tale applicazione di solito fornisce una migliore implementazione di rand () che è specificamente progettato per essere eseguito da un seme che può essere scartato molto spesso con valori casuali reali . Nel nuovo processore Intel con RNG hardware integrato, la parte dell'algoritmo pseudo-casuale è direttamente integrata nel silicio, quindi viene eseguita dall'hardware, producendo un throughput casuale molto elevato.
Se ti preoccupi del metodo rand () stesso, è solo un'espressione matematica progettata per generare una quantità abbastanza grande di entropia. Abbastanza grande a seconda dell'applicazione: per le generazioni di chiavi crittografiche, la casualità deve essere di qualità superiore rispetto alla casualità richiesta per un semplice shuffle casuale nel tuo lettore musicale preferito. È ovvio che maggiore è la qualità dell'output casuale, maggiore è il costo computazionale del numero casuale.
Le operazioni coinvolte in un numero casuale sono abbastanza simili a quelle coinvolte nel calcolo dell'hash MD5 di un file: provano a usare una sorta di effetto valanga bit in modo che una singola modifica bit in un valore seed cambi l'intero modello di generazione. Come nota a margine, NON raccomando di usare MD5 come generatore di numeri pseudo-casuali; era solo un esempio. Sarebbe sia inefficiente che non così casuale, ma il punto è lì: se si alimenta lo stesso file a un algoritmo di hashing MD5, si otterrà sempre lo stesso output deterministico, praticamente nello stesso modo in cui si otterrebbe sempre lo stesso output da la funzione rand () se si inserisce lo stesso seed a meno che l'implementazione non dipenda da alcuni elementi arbitrari come l'ora corrente.