Come funzionano i generatori di numeri casuali?


23

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

Come funzionano i generatori di numeri casuali?


2
I generatori di numeri pseudo casuali usano un seme, una tabella di costanti predefinite e formule matematiche. Generatori di numeri casuali reali usano solitamente il rumore atmosferico. Puoi facilmente ottenere numeri casuali dalla lettura / dev / random.
bendaggio

Il rumore atmosferico è garantito in modo casuale?


14
function rand() { return 4; /* determined by die roll - guaranteed to be random */ }
Neil,

3
Qualcuno deve fare questo: xkcd.com/221 ;)
Valera Kolupaev,

Risposte:


7

I generatori di numeri casuali (RNG) stanno davvero generando numeri pseudocasuali, dal momento che è impossibile generare effettivamente un numero VERAMENTE casuale. Le uniche cose veramente casuali sono gli atti di Dio, come i fulmini.

Questo articolo di Wikipedia potrebbe essere d'aiuto nella spiegazione: http://it.wikipedia.org/wiki/Random_number_generators


Da quello che ho capito, ci sono fondamentalmente due parti di un RNG: il seme, e quindi il numero casuale scelto da quel seme. Quando semini l'RNG, gli stai dando un equivalente di un punto di partenza. Quel punto di partenza ha quindi un gruppo di numeri che sono "dentro" di esso da cui il programma sceglie. In PHP, puoi usare srand () per "mescolare" i semi, in modo da ottenere quasi sempre una risposta diversa. È quindi possibile utilizzare rand (min, max) per andare nel seme e scegliere un numero compreso tra min e max, inclusi.


ATTENZIONE, POSSIBILE ANALOGIA ALLE CHEESY!

Pensa a ogni "seme" come una ghiacciaia, quindi i numeri casuali come cubetti di ghiaccio. Supponiamo che tu abbia 1000 forzieri di ghiaccio e ogni forziere abbia 1000 cubetti di ghiaccio all'interno. Alla fiera della contea, sceglieranno una ghiacciaia da utilizzare per 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 una cassa a caso tra quelle 1000 casse, e poi sceglieranno un cubetto di ghiaccio all'interno di quella cassa a caso. Se funziona per le dimensioni che desidera, lo usano. Se non lo è, lo rimettono nel petto con gli altri. Se vogliono renderlo un po 'più divertente, cambiano in anticipo le casse per la totale dimenticanza, se vuoi!

Per quanto riguarda il modo in cui PHP sceglie fisicamente il seme 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 creerai, rand () dovrebbe essere sufficiente per qualsiasi numero casuale di cui avrai bisogno.

Dai un'occhiata anche ai generatori congruenziali lineari, questo potrebbe essere più di quello che stai cercando se vuoi i dettagli sporchi: http://en.wikipedia.org/wiki/Linear_congruential_generator

Spero che sia di aiuto!


7
In che modo gli atti godsarebbero casuali nel minimo? Inoltre, il fulmine non è casuale, segue un percorso determinato da varie condizioni. Inoltre, l'interprete che genera il numero è essenzialmente irrilevante.

7
Sto usando gli atti di Dio in senso legale: en.wikipedia.org/wiki/Act_of_God Sono considerati casuali poiché vanno oltre l'apparente controllo umano.

4
Quindi, essenzialmente, non c'è nulla di casuale. Ma ciò richiederebbe che ogni evento apparentemente casuale venga influenzato, il che non funziona quando si arriva all'inizio del tempo .... Sembra che prenderò alcune lezioni di filosofia = D

6
@Korvin, per quanto ne sappiamo, i fenomeni quantistici come il decadimento radioattivo o l'emissione di un fotone da parte di un atomo eccitato sono veramente casuali. Tuttavia, matematici e filosofi sostengono che cosa significhi essere veramente casuali. E mentre la gente comune pensa che il lancio di una moneta sia abbastanza casuale, i maghi agili ( news.stanford.edu/pr/2004/diaconis-69.html ) possono ottenere regolarmente 10 teste su 10 lanci.
Charles E. Grant,

1
@Charles - Il lancio di una moneta non è nemmeno una testa / croce binaria, in realtà è testa / croce / bordo, quindi un mago del palcoscenico davvero bravo potrebbe farlo scendere né testa né croce. * 8 ')
Mark Booth,

18

Di solito non sono veramente casuali, ma sono chiamati pseudo-casuali perché generano una sequenza numerica che appare casuale. Questo viene fatto con alcune interessanti formule matematiche. Uno dei più comuni è il generatore congruenziale lineare .

I numeri pseudo-casuali hanno una proprietà utile che i veri numeri casuali non hanno: se usi lo stesso seme quando inizi otterrai una sequenza identica. Questo può essere molto utile per i test.


Se capisco correttamente la tua seconda affermazione: random(5332)sarà sempre uguale a random(5332)?

2
@Korvin, no, intendo che se chiami, srand(5332)il prossimo numero restituito randsarà sempre lo stesso.
Mark Ransom,

3
"sembra casuale" -> ha le stesse proprietà statistiche dei numeri veramente casuali.

+1 per il link LGC Wikipedia, ha un'animazione eccellente del perché i PRNG semplici hanno serie limitazioni quando si eseguono simulazioni multidimensionali Monte-carlo.
Mark Booth,

4

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

C'erano (sono?) Generatori di numeri casuali reali basati su hardware in vendita. Si basavano su un chip con una piccola radio che misurava il rumore bianco della radiazione nello spazio profondo, o un piccolo campione radioattivo e misurava i periodi tra il suo decadimento. Il problema era la larghezza di banda: la quantità di entropia che potevano generare non era molto alta, quindi venivano usati per i semi di algoritmi pseudocasuali. Sono stati utilizzati nei sistemi bancari, alta sicurezza e simili.

OTOH, se incontri qualche sviluppatore di sistemi embedded, loro rideranno di questi. Per scopi comuni nella programmazione di un microcontrollore, la lettura di 4 bit bassi di qualsiasi convertitore analogico-digitale a 16 bit con un pin flottante (non collegato) produrrà un rumore casuale perfettamente buono, con una larghezza di banda più che sufficiente (più breve è il periodo di polling, più " "rumorosa" la lettura) e più semplice della scrittura della routine RNG effettiva. E considerando che gli ADC si trovano comunemente implementati nel silicio di microcontrollori, comunemente implementati e spesso implementati con 8 canali da cui forse ne servono 5 per la vostra applicazione, è praticamente gratuito.

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


2

Esistono molti modi per tentare di emulare una sequenza "casuale" di numeri. La prima tappa dovrebbe essere quella di leggere sui generatori congruenziali lineari , di sicuro. Ecco come funzionano la maggior parte dei generatori di numeri casuali di base, e scommetto che è come funziona la funzione rand () di PHP.

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


Il seme è ciò che mi confonde, non riesco a pensare a nulla che possa seminare la funzione senza una sorta di modello, e anche se non lo è, allora cosa sta causando la generazione del seme casuale!

3
Credo che un timestamp sia spesso usato come seme iniziale quando nessuno è effettivamente fornito da qualche altra fonte. Nel vecchio BASIC, RANDOMIZE TIMERera un linguaggio comune e "abbastanza buono" per la maggior parte degli scopi (non crittografici). Secondo man 3 srand , la libreria GNU C usa un seme fisso di 1 fino a quando il PRNG viene reseded.
un CVn del

1

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

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

Per un generatore pseudo-casuale, la funzione di hashing viene applicata a qualche stato interno nascosto del generatore e il suo output viene utilizzato per a) modificare quello stato interno eb) per calcolare l'output della rand()funzione. La prossima invocazione di rand()utilizzerà tale stato interno modificato e quindi produrrà un risultato diverso. Migliore è la funzione hash, meno facilmente i risultati sono distinguibili dai veri numeri casuali.


È un dato di fatto, i computer al giorno d'oggi 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 mescolare costantemente un "pool di entropia", che è solo pochi kilobyte di stato interno. Gli hash crittografici basati su questo pool di entropia sono resi disponibili tramite i dispositivi /dev/randome /dev/urandom. Quindi, l'accesso ad alcuni numeri casuali davvero molto buoni è semplice come aprire uno di questi due dispositivi e leggere alcuni byte da essi.


-2

I numeri casuali sono numeri generati dal processo il cui output è imprevedibile. cioè non possiamo dire quale sarà il prossimo output. Possiamo prendere un semplice esempio del risultato dei dadi. Ciò che verrà prodotto quando lanciamo un dado è imprevedibile.

Esistono due tipi di numeri casuali 1. Numeri casuali reali 2. Numeri pseudo casuali.

Come vengono generati i numeri casuali


1
Si prega di utilizzare la formattazione del preventivo per evidenziare quali parti della risposta sono tue e quali provengono dalla fonte citata. Se tutta la tua risposta è una copia / incolla da una fonte esterna, qui non è una buona risposta.
Mat

questo non sembra offrire nulla di sostanziale rispetto ai punti formulati e spiegati nelle precedenti 6 risposte
moscerino del
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.