2014-11-25 22 views
5

Devo lavorare con un codice prodotto da un dipendente che ora è in pensione, e ho alcune strane cose riguardanti numeri casuali. In alcuni punti, ha spostato il valore restituito da un PRNG 10 bit a destra e quindi utilizza una maschera su questo valore.E 'sicuro prendere solo pochi bit da un numero ottenuto con un Mersenne Twister

Ho già visto su Internet che alcuni PRNG hanno scarse proprietà di casualità con alcuni bit nel numero che generano (come l'ultimo, semplicemente alternando tra 1 e 0), ma ho cercato se esistesse qualche litteratura per tali problemi sul Mersenne Twister, ma non ne ho trovato nessuno. Qualcuno sa qualcosa su questo?

+0

Il principale di questo codice è generare rumore gaussiano, quindi rau è preso da un tavolo di rayleigh, l'indice è il numero di spostamento e maschera, mentre il teta è preso dallo stesso numero casuale, ma questa volta solo mascherato, non spostato . – Loufylouf

+0

in C++ 11, dichiarando che un generatore gaussiano pulito prende due linee di codice. Se C++ 11 è un'opzione, la sostituzione di tutti i vecchi generatori personalizzati non failproof di STL potrebbe essere una buona opzione. – galinette

+0

Buono da vedere: http://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful – galinette

risposta

1

Normalmente, qualsiasi bit dovrebbe essere casuale, questa è una proprietà del twister Mersenne.

Tuttavia (non conosco MT molto profondamente) potresti avere dipendenza a lungo termine tra alcuni bit. Si consiglia di utilizzare le funzioni della libreria per impostare l'intervallo di numeri interi, piuttosto che organizzare i bit da soli, o non si conoscono mai le proprietà complesse che potrebbero ottenere.

Se si utilizza il C++ 11 libreria standard, basta usare std :: mt19937 insieme std :: uniform_int_distribution

-1

io non sono sicuro circa il Mersenne Twister in particolare, ma quello che viene in mente è il tipico consiglio che si ottiene quando si tenta di ottenere un numero intero casuale nell'intervallo [0, n). Se si dispone di un PRNG ritorno interi con una gamma maggiore di n, si dovrebbe mai usare modulo per ridurre gamma come

x = rand() % n; 

ma deve ridimensionare il numero

x = (int) floor(((double) rand())/((double) RAND_MAX)) * n); 

invece. La ragione è che i bit più significativi del numero pseudo-casuale sono in genere più casuali dei bit minori, quindi mentre l'operazione modulo mantiene le cose belle e in virgola mobile, elimina anche quei preziosi bit significativi.

Mentre non so che cosa ha tentato di fare il codice che hai citato, potrebbe essere che il mascheramento da spostamento a destra più avrebbe potuto essere quello di ridurre l'intervallo dei numeri casuali in un modo che scarta i bit meno significativi .

+0

La mia ipotesi è che sapeva che stava usando un PRNG con scarse proprietà di casualità sui primi bit, quindi ha spostato quel numero per usare la maschera sui bit "più casuali" del numero. Ma sfortunatamente è solo un'ipotesi. – Loufylouf

+0

Questo è solo il caso dei PRNG assolutamente merdosi (che di solito 'rand()' è). Ma lì la scelta giusta è quella di migrare verso un PRNG migliore invece di lucidare uno stronzo. Anche con PRNG mediocri come Mersenne Twister, questo non è un problema. – CodesInChaos

+0

Sto solo cercando di aiutare a rispondere a una domanda. Essendo la domanda su 'C' e con l'altro dipendente _retired_, l'ipotesi che il PRNG potrebbe non essere la migliore è valida.Per quanto riguarda i suggerimenti per l'aggiornamento/scrittura di un nuovo codice, suggerirei semplicemente di utilizzare una libreria come GSL. –