2009-10-12 24 views
10

Considerate il codice come questo (Python):Quanto devono essere diversi i semi casuali?

import random 

for i in [1, 2, 3, 4]: 
    random.seed(i) 
    randNumbers = [random.rand() for i in range(100)] # initialize a list with 100 random numbers 
    doStuff(randNumbers) 

voglio fare in modo che randNumbers differiscono in modo significativo da una chiamata ad un altro. Devo assicurarmi che i numeri di seme differiscano significativamente tra le chiamate successive, o è sufficiente che i semi siano diversi (non importa come)?

Per i pedanti: si prega di realizzare il codice di cui sopra è super-over-semplificato

+0

"differiscono in modo significativo", nel contesto di generatori di numeri casuali, potrebbe significare molte cose diverse. Ci sono test specifici di casualità che stai guardando e che non sono attualmente? I PRNG tipici hanno periodi molto, molto più lunghi di 100 numeri. Di solito si vede un singolo evento di seeding da un orologio di sistema. L'utilizzo dello stesso valore di inizializzazione genererà la stessa sequenza pseudo casuale ogni volta. – Mikeb

+0

Potresti spiegare perché vuoi che i tuoi numeri pseudo casuali siano significativamente differenti? Non è quello di sconfiggere lo scopo di numeri casuali se hai bisogno di una deviazione - dal punto di vista delle statistiche hai la stessa probabilità di ottenere due numeri ravvicinati in sequenza mentre sei molto distaccato (se sono veramente casuali) –

risposta

8

Risposta breve: evitare la semina, poiché non vi compra nulla qui. Risposta lunga qui sotto.


Tutto dipende da cosa esattamente avete bisogno. Nel numero Common defects in initialization of pseudorandom number generators è delineato che i semi lineari dipendenti (che 1, 2, 3, 4 sono decisamente) sono una cattiva scelta per inizializzare più PRNG, almeno se usati per la simulazione e desiderando risultati non correlati.

Se tutto ciò che fai è tirare alcuni dadi, o generare qualche input pseudo-casuale per qualcosa di non critico, allora molto probabilmente non importa.

Si noti inoltre che l'utilizzo di alcune classi di un PRNG stesso per la generazione di semi ha lo stesso problema nella generazione di numeri dipendenti lineari (vengono in mente gli LCG).

2

In generale, è solo seme il generatore di numeri casuali quando si necessità i numeri casuali da generare in maniera identica ogni volta attraverso . Ciò è utile quando si ha un componente casuale per l'elaborazione, ma è necessario testarlo e quindi si desidera che sia coerente tra i test. Altrimenti, si lascia che il sistema inizializzi il generatore stesso.

In altre parole, seminando il generatore di numeri casuali con specifici semi predefiniti, si riduce effettivamente la casualità del sistema nel suo complesso. I numeri casuali generati quando si utilizza un seme di 1 sono effettivamente psuedo-casualmente diversi da quelli con un seme di 2, ma un seme codificato duro comporterà sequenze casuali ripetute in ciascuna esecuzione del programma.

0

I semi stessi devono essere casuali in modo che l'output sia imprevedibile. Ci possono essere problemi se i semi differiscono solo in uno o due bit (come dimostra this question).

+1

Semina manualmente di solito implica che l'output non ha bisogno di essere imprevedibile. E quanto i semi dovrebbero differire molto dipende dall'algoritmo del PRNG. – Joey

+0

Implica che l'output non ha bisogno di essere imprevedibile, ma ciò presuppone anche che il richiedente la domanda realizzi che i generatori di semi generano la stessa sequenza di numeri. – Matt

+0

@Johannes: Assolutamente, ma se vuoi davvero un output imprevedibile, non vuoi che qualcuno sia in grado di indovinare il seme. Quindi per questo motivo è meglio che il seme stesso sia completamente imprevedibile (per esempio da/dev/random). –

0

Dipende dall'applicazione per cui si sta utilizzando il PRNG. Se si utilizza qualcosa che deve essere crittograficamente valido, i semi generalmente devono essere estremamente difficili da dedurre in base all'output, diverso ogni volta che l'applicazione viene eseguita, difficile da indovinare e impossibile da determinare mediante il reverse engineering dell'applicazione (cioè non possono essere hardcoded).

Se il tuo obiettivo è un gioco, le tue esigenze potrebbero essere diverse. Ad esempio, se stai controllando la strategia del computer, ma la strategia del computer rimane la stessa per tutte le esecuzioni del gioco, potresti avere un gioco facilmente battibile. Poi di nuovo, potresti volerlo per la modalità "facile".

+1

Se questo ha qualcosa a che fare con crypto, quindi MT19937 è un generatore molto sbagliato per cominciare, però. – Joey

1

Sembra che vogliate numeri pseudo-casuali che non siano pseudo-casuali, con una probabilità più alta di numeri consecutivi che siano "significativamente" diversi da quelli richiesti dalla pseudo-casualità. Dubito che qualsiasi prng comune lo farà, qualunque sia la tua strategia di semina.

4

Se il generatore di numeri casuali è di alta qualità, non dovrebbe importare come lo si semina. In effetti, la migliore pratica sarebbe quella di seminare solo una volta.I generatori di numeri casuali sono progettati per avere determinati comportamenti statistici una volta avviati. La risemina genera in modo efficace un diverso generatore di numeri casuali, che potrebbe non essere altrettanto valido.

Selezionare in modo casuale i semi sembra una buona idea, ma non lo è. Infatti, a causa del "paradosso del compleanno", c'è una probabilità sorprendentemente elevata che tu scelga lo stesso seme due volte.

Problemi correlati