Come posso determinare il periodo del mio generatore di numeri pseudo-casuale?


14

Supponiamo che io stia usando un generatore di numeri pseudo-casuale congruenziale lineare (PRNG). Dato un seme , il fattore moltiplicativo (a), il fattore di spostamento (c) e il fattore modulo (m), come posso determinare il periodo del mio PRNG? Lo determino mediante algoritmi di sperimentazione / rilevazione di modelli o esiste una formula diretta per calcolare il suo periodo? X0

Sebbene la mia domanda riguardi specificamente il metodo congruenziale lineare, sono aperto a sapere di più su come i periodi sono calcolati in pratica anche per altri PRNG.



A proposito, se stai usando LFSR, il periodo è massimo se il polinomio di feedback è primitivo . In tal caso, il periodo AFAIK (non citarmi; troppo pigro per approfondire le note del corso) è dove il polinomio di feedback p ( x ) F q [ x ] di grado n , e q è la dimensione di il campo dei coefficienti. qnp(X)Fq[X]nq

2
Gli algoritmi di rilevazione del ciclo di Floyd e gli algoritmi di rilevazione del ciclo di Brent sono entrambi modi efficienti per rilevare i cicli. Entrambi restituiranno alcune L multiple del periodo e, una volta ottenuto, puoi fattorizzare L e vedere qual è il fattore più piccolo che è un punto.
xdavidliu,

Risposte:


12

Se ti limiti a PRNG LCG a ciclo completo, la risposta è semplice, per definizione è semplicemente m . m

Per trovare il periodo di un PRNG LCG non a ciclo completo per un dato seme, devi solo contare il numero di iterazioni del PRNG fino a quando non genera nuovamente il valore del seme.

Dalla pagina di Wikipedia di riferimento :

Durata del periodo

Il periodo di un LCG generale è al massimo m , e per alcune scelte molto meno di quello. A condizione che c sia diverso da zero, il LCG avrà un periodo completo per tutti i valori di seed se e solo se :

cmun'

Storicamente, le scelte sbagliate avevano portato a implementazioni inefficaci di LCG. Un esempio particolarmente illustrativo di questo è RANDU, che è stato ampiamente utilizzato nei primi anni '70 e porta a molti risultati che sono attualmente in discussione a causa dell'uso di questo scarso LCG.

Perché vuoi usare un generatore a ciclo completo

Se non ti limiti ai PRNG LCG a ciclo completo, stai correndo un rischio enorme .

Se non sai che un determinato LCG è a ciclo completo, potresti finire con un generatore con un numero arbitrario di sequenze reciprocamente distinte, alcune delle quali potrebbero essere imbarazzantemente piccole e avere una casualità spaventosa, forse anche peggio del famigerato generatore RANDU .

Non devi davvero controllare ogni possibile valore seed per assicurarti che generi una sequenza abbastanza lunga per la tua applicazione.

Ulteriori letture

Per un eccellente primer sui generatori di numeri pseudo casuali, consiglio vivamente di leggere il capitolo Ricette numeriche sui numeri casuali.


Questo è vero, ma non mi sto vincolando al PRNG LCG per l'intero periodo ... Sono curioso delle scelte sbagliate di a, c e m, tali che i flussi casuali che non raggiungono il periodo completo. Mi piacerebbe essere in grado di sapere in anticipo, dati alcuni a, c e m, quale sarà il periodo inevitabilmente. So che è delimitato da m, ma mi chiedevo se possiamo fare di meglio e ottenere il periodo esatto.
Paolo

Non penso che questo stia spaccando i capelli su un tecnicismo: la domanda era "come determinare il periodo di un LCG con parametri arbitrari", mentre questa risposta dice "non usare LCG arbitrari, usa sempre LCG a periodo completo, e supponendo che lo facciate , la risposta alla vostra domanda sarebbe il periodo massimo possibile, per definizione ". L'argomentazione per l'utilizzo di LCF a tempo pieno esposta in questa risposta è perfettamente convincente, ma il problema è che non è affatto quello che la domanda pone.
xdavidliu,

Scusa @xdavidliu ma non vedo come il tuo nuovo commento mi aiuti a migliorare la mia risposta. Hai portato alla mia attenzione che in realtà non ho risposto alla domanda, ho modificato la mia risposta per risolverlo e poi ti ho fatto sapere in un modo che pensavo potesse farti sorridere (se sei un fan di Futurama). Non vedo che bisogna dire altro.
Mark Booth,

Si noti che sullo scambio di stack, i commenti non sono intesi per discussioni estese, a tale scopo utilizzare Computational Science Chat . I commenti aiutano a migliorare le domande e le risposte e sono fonte di distrazione, quindi cerchiamo di mantenerli al minimo. I commenti devono essere considerati effimeri, qualsiasi commento che non aiuta più attivamente a migliorare una domanda o una risposta può essere eliminato in qualsiasi momento per riordinare un post.
Mark Booth,
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.