Generatore di numero Pseudocasuale lineare (PRNG)
Da Radu Motisan Annunciato il 17 gennaio 2010
Introduzione
Molto spesso abbiamo bisogno di generare numeri casuali con scopi diversi entro i limiti di giochi semplici ad algoritmi di crittografia di progressi.
Molti C/C ++ i programmatori sono bene usati con lo srand () / rand () le funzioni, ma semplicemente l'utilizzazione di un codice predefinito per portare a termine i compiti dati, sono qualche volta non abbastanza.
Completamente comprensione come un numero casuale è, come può esser generato, aiuta l'acquisizione della soluzione migliore.
Cominciando dai miei primi anni universitari, usai un generatore pseudocasuale lineare, facile da attuare, e abbastanza utile in molte applicazioni.
Un generatore di numero pseudocasuale (PRNG) è un algoritmo per generare una successione di numeri che approssima le proprietà di numeri casuali. La successione non è veramente casuale in questo è completamente determinata da una serie relativamente piccola di valori iniziali, chiamati lo stato del PRNG. Legga più qui. Read more here.
Un approccio semplice
Consideriamo a, b e c tre intero costante. Progettiamo di generare una serie dei numeri X0, X1 pseudocasuali..., Xn. Assumendo X0 = d, il resto dei numeri può esser computato in un'utilizzazione ricorrente della formula: Assuming X0 = d, the rest of the numbers can be computed in a recurrent using the formula:
Xn+1 = (a*Xn + b) il % c.
a, b, c e d sono i valori iniziali, anche conosciuti come stato del PRNG.
il c limita i valori risultanti all'intervallo 0.. c-1
a e b stanno intaccando l'angolo lineare.
Qui è un algoritmo C semplice per illustrare meglio la formula:
#include
l'intervallo principale ()
{
l'intervallo a=71, b=19, c=256, d = 3;l'intervallo x [200], io = 0;
x [0] = d;
per (i=1; io<200;i++)
x [io] = (a*x [i-1] + b) il % c;il printf ("I numeri casuali falsi are:\n");
per (i=0; io<200;i++)
printf (" %d", x [io]);ritorni 1;
}
Lei può vedere il risultato nell'immagine seguente:

Codice sorgente here:pnrg1.
Assomigliare allo srand () e rand () funziona Lei è tutto& solito di, ho bisogno di mettere questo in risalto loro stanno anche usando un PRNG. srand () "semina" il generatore casuale e praticamente tutto che fa deve mettere i valori iniziali (lo stato di PRNG).
Lei può facilmente adattare il generatore sopra per lavorare come srand () e rand ():
#include
l'intervallo = 71, b = 19, d = 0;
il vuoto mysrand (il seme d'intervallo)
{
d = seme;
}l'intervallo myrand (la soglia d'intervallo)
{
l'intervallo x = d;
x = (a*x + b) la soglia di %;
d = x;//avanzano con ogni telefonata di funzione
restituisca x;
}essenziale vuoto ()
{
mysrand (122);
il printf ("il numero Pseudocasuale: il %d\n", myrand (256));
il printf ("il numero Pseudocasuale: il %d\n", myrand (256));}
Risultato come immaginato sotto:

Il codice sorgente qui: pnrg2
Lei rapidamente noterà che il PRNG produce la stessa produzione ogni volta che Lei inizializza il mysrand con lo stesso valore:
il mysrand (122)-> myrand (256) =233
Ma questo è lo stesso nel caso del costruito in srand () e rand () la funzione anche. La ragione è quella che non abbiamo una buona sorgente per caos. Lei può vincere questo utilizzando: You can overcome this by using:
mysrand (GetTickCount);
o
mysrand (Cursorpos.x)
o
mysrand (FreeRAMMemory)
o
mysrand (UserLastKeyPressed)
o eccetera, collegando la funzione d'inizializzazione a un avvenimento casuale.
Analisi più lontana
Parlando del livello di caos di questo generatore, c'è un modo semplice di analizzare una successione di numeri, nel nostro caso lo X0..., Xn serie outputed da PRNG lineare.
1. In uno spazio dimensionato solo, rappresentato dall'asse di numero vero e la serie corrispondente di tutti i numeri veri (R), un numero dato può esser visto come un'entità sola che corrisponde a un punto sull'asse.
Per eg., vedi il quadro seguente:

Questo rappresenta alcuni numeri veri sull'asse. Uno potrebbe chiedere, quello che è il significato del numero-1.13. La risposta semplice è:-1.13 è l'entità che siede sull'asse alla posizione data. Parecchie proprietà possono esser estrapolate, e riceviamo un significato di quello che-1.13 è, e il più importante: quello che può noi fare con questo. The simple answer is: -1.13 is the entity that sits on the axis at the given position. Several properties can be extrapolated, and we get a meaning of what -1.13 is, and most important: what can we do with it.
2. Per un paio dato di numeri, possiamo l'immagine uno spazio bidimensional, dove il paio rappresenta un punto in un sistema Cartesiano di riferimento. Il paio riceve un significato, e possiamo più lontano aggiungere particolari a questo, usando il paio con vari scopi.
In un modo simile, per una serie data di numeri (x0, x1..., xn) che sembrano casuali e senza senso all'inizio, non dimenticare che in uno spazio n-dimensional, la serie di numeri ha un significato molto semplice e chiaro: questo rappresenta un punto.
Per fortuna, per il PRNG's le cose sono più semplici.
Dato una serie di numeri generati con PRNG lineare, loro possono esser rappresentati senza qualsiasi significato in una dimensione: loro sarebbero punti "casuali" sull'asse di numero.
MA, possiamo perquisire alla ricerca di un "sentiero" o un "significato" movendoci verso uno spazio superiore, in questo caso verso due dimensioni, e rappresentando i numeri falsi messi da punto di coordinate (Xn-1, Xn).
Vedi il campione seguente:
1-Il primo campione PRNG ho annunciato, ho prodotto i numeri seguenti:
3 83 24 72 11 32243120 91 80 67168.... eccetera
È molto duro capire quello che questi numeri significano o dare uno scopo a questa successione o perfino capire il modello che servì per produrli.
2-scrivere un programma semplice per illustrare graficamente in due paia di dimensioni di numeri (Xn, Xn+1) come punti in un sistema Cartesiano.

I punti nel quadro non sono nient'altro allora i 200 numeri casuali falsi (3 83 24 72 11 32243120 91 80 67168
171 8 75224 51 56155 16 6
4211152 59112 545700355 40 43 0 19
88123 48 99136203 96179184 27144 3 83 24187
240163 72 11 32243120 91 80 67
227 8 75224 51 56155 16 64211152 59112 35200
814135811 40 43 0 19 88123 48 99136203 9
6179184 27144 3 83 24 72 11 32243
120 91 80 67 8 75224 51 56155
16 64211152 59112 35 200 139 20
8195 40 43 0 19 88123 48 99136203 96179184 27144 3232
107192 83 24187240)
In modo interessante, quello che a primo sembrò il caos totale, adesso ricorda all'ordine appropriato di un frutteto con alberi in modo conveniente piantati in file e colonne, con un angolo dato, nella nostra immagine rappresentata dai punti neri.
Riceva il codice sorgente qui: pnrg3gui
Se visualizzazione della successione in due dimensioni non mostra niente utile, noi possiamo muoverci più lontano e controllare la rappresentazione in tre dimensioni, punti di coordinate (Xn-1, Xn, Xn+1), e così via.
Come mostrato sopra, a un livello dato, il contenuto "casuale" riceverà un significato.
La speranza questo aiuta,
Radu








