Come funzionano i generatori di numeri casuali?

20

Stavo solo riflettendo sulla funzione di php rand() e pensando a come potrei rifarlo, e sono venuto completamente stupito.

Come funzionano i generatori di numeri casuali?

    
posta Korvin Szanto 20.09.2011 - 23:41
fonte

6 risposte

7

Generatori di numeri casuali (RNG) generano in realtà numeri pseudocasuali, poiché è impossibile generare effettivamente un numero casuale VERAMENTE. Le sole cose veramente veramente casuali sono atti di Dio, come i fulmini.

Questo articolo di Wikipedia potrebbe aiutarti nella spiegazione: link

Da quanto ho capito, ci sono fondamentalmente due parti di un RNG: il seme e quindi il numero casuale scelto da quel seme. Quando si semina il RNG, si sta dando un equivalente a un punto di partenza. Quel punto di partenza ha quindi un mucchio di numeri che sono "dentro" da cui il programma sceglie. In PHP, puoi usare srand () per "mescolare" i semi, in modo da ottenere quasi sempre una risposta diversa. Puoi quindi usare rand (min, max) per entrare nel seme e scegliere un numero compreso tra il minimo e il massimo, inclusi.

AVVERTENZA, POSSIBILE ANALOGIA DI FORMAGGI AVANTI!

Pensa a ogni "seme" come a una ghiacciaia, e quindi ai numeri casuali come cubetti di ghiaccio. Diciamo che hai 1000 casse del ghiaccio e ogni cassa ha 1000 cubetti di ghiaccio all'interno. Alla fiera della contea, sceglieranno una ghiacciaia per iniziare a usare le bevande e potranno usare solo un cubetto di ghiaccio. Tuttavia, hanno solo bisogno di cubetti di ghiaccio più grandi di 1 pollice cubo. Quindi sceglieranno un baule a caso tra quei 1000 forzieri, e poi sceglieranno un cubetto di ghiaccio dentro quel baule a caso. Se funziona per le dimensioni che vogliono, lo usano. Se non lo è, lo rimettono nel petto con gli altri. Se vogliono renderlo un po 'più divertente cambiano le casse in anticipo per la totale dimenticanza, se vuoi!

Per quanto riguarda il modo in cui PHP sceglie fisicamente il seed e il numero casuale, non ho abbastanza conoscenza per quello (che è probabilmente quello che ti stavi chiedendo di più!). Non proverei a ripetere la funzione rand (); per la maggior parte delle applicazioni web che farai, rand () dovrebbe essere sufficiente per ogni numero casuale di cui avrai bisogno.

Controlla anche i generatori congruenziali lineari, questo potrebbe essere più di quello che stai cercando se vuoi i dettagli sporchi: link

Spero che questo aiuti!

    
risposta data 20.09.2011 - 23:57
fonte
18

Di solito non sono veramente casuali, ma sono definiti pseudo-casuali perché generano una sequenza numerica che appare casuale. Questo è fatto con alcune interessanti formule matematiche. Uno dei più comuni è Generatore lineare di Congruential .

I numeri pseudo-casuali hanno una proprietà utile che i veri numeri casuali non hanno: se si usa lo stesso seme quando si inizia, si otterrà una sequenza identica. Questo può essere molto utile per i test.

    
risposta data 20.09.2011 - 23:53
fonte
4

Stai chiedendo Pseudorandom o Casuale? Altri hanno risposto alla pseudocasuale, lasciami parlare di Random.

C'erano (sono?) veri generatori di numeri casuali basati sull'hardware in vendita. Si basavano su un chip con una piccola radio che misura il rumore bianco delle radiazioni dello spazio profondo, o un piccolo campione radioattivo e periodi di misurazione tra il suo decadimento. Il problema con loro era la larghezza di banda: la quantità di entropia che potevano generare non era molto alta, quindi erano usati per i semi di algoritmi pseudocasuali. Sono stati utilizzati in sistemi bancari, ad alta sicurezza e simili.

OTOH, se incontri uno sviluppatore di sistemi embedded, rideranno di questi. Per scopi comuni nella programmazione di un microcontrollore, leggendo i 4 bit bassi di qualsiasi convertitore analogico-digitale a 16 bit, un pin flottante (non connesso) produce un rumore casuale perfettamente buono, con larghezza di banda più che sufficiente (più breve è il periodo di polling più " rumoroso "la lettura), e più facile di scrivere la routine RNG reale. E considerando che gli ADC sono comunemente trovati implementati in silicio di microcontrollori, comunemente implementati e spesso implementati con 8 canali dai quali è necessario forse 5 per la tua applicazione, è praticamente gratuito.

E anche se non hai un ADC, un paio di elementi collegati a un pin digitale GPIO produrranno un rumore piuttosto buono. In embedded, il rumore è sempre presente (e costantemente combattuto), e quindi ottenere un certo casualità è molto facile.

    
risposta data 21.09.2011 - 16:15
fonte
2

Ci sono molti modi per tentare di emulare una sequenza "casuale" di numeri. La prima tappa dovrebbe essere la lettura di generatori congruenziali lineari , di sicuro. Questo è il modo in cui funzionano i generatori di numeri casuali di base, e scommetto che è come funziona la funzione rand () di PHP.

La domanda successiva più interessante su cui riflettere è come si semina? tempo? Indirizzo IP? ecc.

    
risposta data 20.09.2011 - 23:51
fonte
1

Prima di tutto, praticamente tutte le funzioni rand() non forniscono la casualità vera, piuttosto forniscono i cosiddetti numeri pseudo-casuali.

Quindi, come funzionano i generatori di numeri pseudo casuali? Sostanzialmente nello stesso modo in cui funziona la crittografia: hai una funzione (un hash) che richiede un input e produce un output in un modo così complesso che è impossibile dall'output per indovinare l'input o viceversa. Cioè, ogni cifra può essere usata per creare un generatore pseudo-casuale piuttosto buono. Tuttavia, sebbene sia possibile utilizzare qualsiasi generatore pseudo-casuale per fare la crittografia in linea di principio, la maggior parte dei generatori di numeri pseudo casuali sono principalmente sviluppati per la velocità, non per la sicurezza crittografica, quindi non danno fastidi agli hacker.

Per un generatore pseudo-casuale, la funzione di hashing viene applicata ad alcuni stati interni nascosti del generatore e il suo output viene utilizzato per a) modificare lo stato interno e b) per calcolare l'output della funzione rand() . L'invocazione successiva di rand() userà lo stato interno modificato e quindi produrrà un risultato diverso. Migliore è la funzione di hash, meno facilmente i risultati sono distinguibili dai veri numeri casuali.

Di fatto, oggigiorno i computer hanno accesso a numeri casuali reali: derivano dal jitter nei tempi di interruzioni prodotte da dispositivi esterni. Linux usa questi valori di piccola incertezza per stimolare costantemente un "entropy pool", che è solo alcuni kilobyte di stato interno. Gli hash crittografici basati su questo pool di entropia sono resi disponibili tramite i dispositivi /dev/random e /dev/urandom . Quindi, l'accesso ad alcuni numeri casuali veramente buoni è semplice come aprire uno di questi due dispositivi e leggerne alcuni byte.

    
risposta data 01.05.2016 - 15:36
fonte
-2

I numeri casuali sono numeri generati dal processo il cui output è imprevedibile. io non possiamo dire quale sarà la prossima uscita. Possiamo prendere qualche semplice esempio di risultato dei dadi. Ciò che verrà emesso quando lanciamo un dado è imprevedibile.

Ci sono due tipi di numeri casuali 1. Veri numeri casuali 2. Numeri pseudo casuali.

Come vengono generati i numeri casuali

    
risposta data 01.05.2016 - 13:40
fonte

Leggi altre domande sui tag