Stavo solo riflettendo sulla funzione rand() di php e pensando a come avrei potuto rifarla, e sono arrivato completamente stupito.

Come funzionano i generatori di numeri casuali?

Commenti

  • I generatori di numeri pseudo casuali usano un seme, un tabella di costanti predefinite e formule matematiche. Generatori di numeri casuali reali di solito usano il rumore atmosferico. Puoi ottenere facilmente numeri casuali leggendo / dev / random.
  • È garantito che il rumore atmosferico sia casuale?
  • random.org ha un discussione abbastanza buona sui numeri casuali e su come ‘ vengono generati .
  • function rand() { return 4; /* determined by die roll - guaranteed to be random */ }
  • Qualcuno deve farlo: xkcd.com/221 😉

Risposta

I generatori di numeri casuali (RNG) stanno davvero generando numeri pseudocasuali, poiché è impossibile generare effettivamente un numero VERAMENTE casuale. Le uniche cose veramente casuali sono atti di Dio, come un fulmine.

Questo articolo di wikipedia potrebbe essere in grado di aiutarti nella spiegazione: http://en.wikipedia.org/wiki/Random_number_generators


Da quello che ho capito, ci sono fondamentalmente due parti di un RNG: il seme, e poi il numero casuale scelto da quel seme. Quando metti il seme del RNG, stai dando è equivalente a un po iniziale int. Quel punto di partenza ha quindi un mucchio di numeri che sono “dentro” e tra 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 entrare nel seme e scegliere un numero tra il minimo e il massimo inclusi.


ATTENZIONE, POSSIBILE ANALOGIA CHEESY IN AVANTI!

Pensa a ogni “seme” come a una ghiacciaia, e poi ai numeri casuali come cubetti di ghiaccio. Supponiamo che tu abbia 1000 forzieri di ghiaccio e ogni baule contenga 1000 cubetti di ghiaccio allinterno. 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 allinterno di quella cassa a caso. Se funziona per le dimensioni che vogliono, lo usano. Se non lo è, lo rimettono nel petto insieme agli altri. Se vogliono renderlo un po più divertente, cambiano il petto in anticipo per dimenticarsene completamente, se vuoi!

Per quanto riguarda il modo in cui PHP effettivamente 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 rifare la funzione rand (); per la maggior parte delle applicazioni web che creerai, rand () dovrebbe essere sufficiente per qualsiasi numero casuale di cui avrai bisogno.

Controlla anche linearmente congruente generatori, questo potrebbe essere più di quello che “stai cercando se vuoi dettagli sporchi: http://en.wikipedia.org/wiki/Linear_congruential_generator

Spero che questo aiuti!

Commenti

  • In che modo le azioni di god sarebbero casuali minimamente? Inoltre, i fulmini non sono ‘ casuali, seguono un percorso determinato da varie condizioni. Inoltre, linterprete che genera il numero è essenzialmente irrilevante.
  • ‘ sto utilizzando atti di Dio in senso legale: en.wikipedia.org/wiki/Act_of_God Sono considerati casuali poiché sono al di fuori dellapparente controllo umano.
  • Quindi, essenzialmente, non cè nulla di casuale. Ma ciò richiederebbe che ogni evento apparentemente casuale sia influenzato, il che ‘ non funziona quando arrivi allinizio del tempo …. Sembra che io ‘ prenderò alcune lezioni di filosofia = D
  • @Korvin, per quanto ne sappiamo, i fenomeni quantistici come il decadimento radioattivo o lemissione di un fotone da parte di un atomo eccitato sono genuinamente casuali . Tuttavia, matematici e filosofi sostengono cosa significhi essere genuinamente casuali. E mentre la gente comune pensa che il lancio di una moneta sia piuttosto casuale, i maghi di scena agili ( news.stanford.edu/pr/2004/diaconis-69.html ) possono farlo regolarmente ottieni 10 teste su 10 lanci.
  • @Charles – Il lancio di una moneta non è ‘ nemmeno un testa / croce binaria, è ‘ è in realtà testa / croce / bordo, quindi un mago da palcoscenico davvero bravo potrebbe far sì che non scendesse né testa né croce. * 8 ‘)

Risposta

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

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.

Commenti

  • Se ‘ capisco correttamente la tua seconda affermazione: random(5332) sarà sempre uguale a random(5332)?
  • @Korvin, no voglio dire se chiami srand(5332) quindi il numero successivo restituito da rand sarà sempre lo stesso.
  • ” appare casuale ” – > ha le stesse proprietà statistiche dei numeri veramente casuali.
  • +1 per il link LGC di Wikipedia, questo ha un eccellente animazione del motivo per cui i PRNG semplici hanno serie limitazioni quando si eseguono simulazioni Monte-carlo multidimensionali.

Risposta

Sono y Stai chiedendo Pseudorandom o Random? Altri hanno risposto sullo pseudocasuale, lasciatemi parlare di Random.

Cerano (sono?) In vendita dei generatori di numeri casuali basati su hardware. Si basavano su un chip con una piccola radio che misurava il rumore bianco della radiazione spaziale profonda, o un piccolo campione radioattivo e misurava i periodi 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 sono stati utilizzati per i semi di algoritmi pseudocasuali. Sono stati utilizzati nei sistemi bancari, ad alta sicurezza e simili.

OTOH, se incontri uno sviluppatore di sistemi embedded, ne rideranno. Per scopi comuni nella programmazione di un microcontrollore, leggere 4 bit bassi di qualsiasi convertitore analogico-digitale a 16 bit con un pin flottante (non connesso) produrrà un rumore casuale, con una larghezza di banda più che sufficiente (più breve è il periodo di polling, più “rumorosa” la lettura) e più facile che scrivere leffettiva routine RNG. E considerando che gli ADC si trovano comunemente implementati nel silicio dei microcontrollori, comunemente implementati e spesso implementati con 8 canali da cui ti servono forse 5 per la tua applicazione, è praticamente gratuito.

E anche se non hai un ADC, un paio di elementi collegati a un pin GPIO digitale produrranno un buon Noise In embedded, il rumore è ev presente (e costantemente combattuto), quindi ottenere una certa casualità è molto facile.

Risposta

Ci sono molti modi per tentare di emulare una sequenza di numeri “casuale”. La tua prima tappa dovrebbe essere leggere sicuramente sui generatori congruenti lineari . Questo è il modo in cui funzionano la maggior parte dei generatori di numeri casuali e scommetto che è come funziona la funzione rand () di PHP.

La domanda successiva più interessante su cui riflettere è come si fa a seminare? Tempo ? Indirizzo IP? Ecc.

Commenti

  • Il seme è ciò che mi confonde, posso ‘ Non pensare a nulla che possa eventualmente seminare la funzione senza un qualche tipo di modello, e anche se non lo è, allora cosa sta causando la generazione del seme casuale in primo luogo!
  • Credo che un timestamp sia spesso usato come seme iniziale quando nessuno è effettivamente fornito da unaltra fonte. Nel vecchio BASIC, RANDOMIZE TIMER era un idioma comune e ” buono abbastanza ” per la maggior parte degli scopi (non crittografici). Secondo man 3 srand , la libreria GNU C utilizza un seme fisso di 1 fino al reseeding del PRNG.

Risposta

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

Quindi, come funzionano i generatori di numeri pseudo-casuali? Fondamentalmente nello stesso modo in cui funziona la crittografia: hai una funzione (un hash) che accetta un input e produce un output in un modo così complesso che è impossibile dalloutput indovinare linput o viceversa. Cioè, ogni cifratura può essere utilizzata per creare un generatore pseudo-casuale piuttosto buono. Tuttavia, mentre è 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 darà fastidio agli hacker.

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


In effetti, i computer oggigiorno hanno accesso a numeri casuali reali: derivano dal jitter nella temporizzazione degli interrupt prodotti 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/random e /dev/urandom. Quindi, laccesso ad alcuni numeri casuali davvero ottimi è semplice come aprire uno di questi due dispositivi e leggere alcuni byte da essi.

Risposta

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 di risultato dei dadi. Ciò che verrà visualizzato quando lanciamo un dado è imprevedibile.

Esistono due tipi di numero casuale 1. Numeri casuali veri 2. Numeri pseudo casuali.

Come vengono generati i numeri casuali

Commenti

  • Utilizza la formattazione delle virgolette per evidenziare quali parti del la risposta è tua e che proviene dalla fonte che citi. Se la tua risposta è solo un copia / incolla da una fonte esterna, ‘ non è una buona risposta qui.
  • questo non ‘ sembra che non offra qualcosa di sostanziale sui punti fatti e spiegati nelle 6 risposte precedenti

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *