2012-06-05 18 views
5

Uso semi sequenziali (1,2,3,4, ...) per la generazione di numeri casuali in una simulazione. Il fatto che i semi siano vicini l'un l'altro rende anche i numeri pseudo-casuali generati?I semi vicini nella generazione di numeri casuali possono fornire numeri casuali simili?

penso che non cambia nulla, ma sto usando python

Edit: ho fatto alcune prove e i numeri non simile. Ma temo che la somiglianza non possa essere notata solo guardando i numeri. C'è qualche caratteristica teorica della generazione di numeri casuali che garantisce che semi diversi forniscano numeri pseudo-casuali completamente indipendenti?

+2

Cosa si può fare se non vi fidate del RNG (un po 'di un hack, lo ammetto) è passare il seme attraverso l'algoritmo SHA1 da 'hashlib'; è progettato per mappare valori simili a quelli completamente distinti. –

+0

Ho notato questo effetto ma penso che fosse in Microsoft C++, non in Python. Credo che il modulo 'random' usi algoritmi migliori. –

risposta

2

Ci sarà sicuramente una correlazione tra il seme e i numeri casuali generati, per definizione. La domanda è se l'algoritmo di randomizzazione sia sufficiente per produrre risultati che sembrano non corretti, e dovresti studiare i metodi per valutare la casualità per rispondere a questa domanda.

Hai ragione ad essere preoccupato però. Ecco i risultati dalla funzione di Microsoft C++ rand con valori di inizializzazione 0-9:

38 7719 21238 2437 8855 11797 8365 32285 10450 30612 
    41 18467 6334 26500 19169 15724 11478 29358 26962 24464 
    45 29216 24198 17795 29484 19650 14590 26431 10705 18316 
    48 7196 9294 9091 7031 23577 17702 23503 27217 12168 
    51 17945 27159 386 17345 27504 20815 20576 10960 6020 
    54 28693 12255 24449 27660 31430 23927 17649 27472 32640 
    58 6673 30119 15745 5206 2589 27040 14722 11216 26492 
    61 17422 15215 7040 15521 6516 30152 11794 27727 20344 
    64 28170 311 31103 25835 10443 497 8867 11471 14195 
    68 6151 18175 22398 3382 14369 3609 5940 27982 8047 
+0

'rand' è notoriamente inaffidabile su alcune piattaforme. Il modulo 'random' di Python usa un algoritmo Mersenne Twister, che non è considerato abbastanza buono per crypto, ma molto meglio della maggior parte delle implementazioni di' rand'. –

0

Primo: definire la somiglianza. Successivo: codifica un test di somiglianza. Quindi: controlla la somiglianza.

Con solo una vaga descrizione della somiglianza è difficile verificarlo.

0

Che tipo di simulazione stai facendo?

Per scopi di simulazione, l'argomento è valido (in base al tipo di simulazione) ma se lo si implementa in un ambiente diverso dalla simulazione, potrebbe essere facilmente violato se richiede che ci siano problemi di sicurezza dell'ambiente basati su i numeri casuali generati.

Se si sta simulando il risultato di una macchina se è dannoso per la società o meno, il risultato dei risultati non sarà accettabile. Richiede la massima casualità in ogni modo possibile e non mi fiderei mai del tuo ragionamento.

0

Per citare la documentazione del modulo random:

note generali sul nucleo generatore Mersenne Twister sottostante:

  • Il periodo è 2 ** 19937-1.
  • È uno dei generatori più ampiamente testati esistenti.

sarei più preoccupato per il mio codice in fase di rotta rispetto al mio RNG non essere abbastanza casuale. In generale, i tuoi sentimenti istintivi sulla casualità saranno sbagliati - la mente Umana è veramente brava a trovare modelli, anche se non esistono.

Finché sapete che i risultati non saranno "sicuri" a causa della mancanza di seeding casuale, si dovrebbe andare bene.

+0

scusa, cosa intendi con questo: "i tuoi risultati non saranno 'sicuri' a causa della tua mancanza di seeding casuale"? Cosa intendi con 'sicuro'? E stai davvero dicendo che non è sicuro a causa della mia semina sequenziale? Sembra contraddittorio con quello che hai detto prima sul fatto che il modulo casuale sia affidabile ... –

+0

@Homero: voglio dire che, se stai usando questa casualità per qualsiasi tipo di sicurezza, sei vulnerabile a chiunque conosca il tuo metodo di semina . Se, OTOH, stai eseguendo una sorta di simulazione e desideri solo risultati riproducibili, dovresti ottenere una casualità "sufficiente". –

+1

-1 perché la domanda riguardava il modo in cui una sequenza di semi correlati influisce sulla qualità dei numeri casuali prodotti, non sulla qualità dei numeri casuali quando si basa su un singolo seme. Questa domanda è rilevante, ad esempio, quando si crea un gruppo di generatori diversi (forse uno per thread) all'inizio di un programma con multithreading. Vuoi evitare risultati correlati tra i generatori. Penso che la risposta di @ rossum sia un buon modo per farlo. –

2

Se si è preoccupati per i semi sequenziali, non utilizzare semi sequenziali. Impostare un RNG master, con un seed noto, e quindi prelevare le uscite successive da quel RNG master per seminare i vari RNG secondari secondo necessità.

Poiché si conosce il seed iniziale per il RNG master, è possibile eseguire di nuovo l'intera simulazione, esattamente come prima, se necessario.

masterSeed <- 42 
masterRNG <- new Random(masterSeed) 

childRNGs[] <- array of child RNGs 

foreach childRNG in childRNGs 
    childRNG.setSeed(masterRNG.next()) 
endforeach 
+1

Non sono sicuro che sia una buona idea, perché corri il rischio di duplicare i semi. Ad esempio, ciò sarebbe molto probabile se si generano numeri a 16 bit e si eseguono migliaia di processi. – Will

+0

La domanda riguarda semi sequenziali, non semi duplicati. Se i semi duplicati sono un problema, utilizzare un codice a blocchi a 128 bit e crittografare i numeri 0, 1, 2, 3, ... 2^128-1. Essendo un cifrario, i numeri sono garantiti per non duplicare per un tempo molto lungo, fino a quando il contatore non si ribalta. Una chiave diversa darà una diversa permutazione dei numeri. Per duplicare la permutazione usa la stessa chiave. – rossum

1

ho trovato misurabile, ma piccola, correlazioni di numeri casuali generati dal Mersenne Twister quando si utilizza semi sequenziali per varie simulazioni - i cui risultati sono mediati per produrre i risultati finali. In Python su Linux, le correlazioni spariscono se io uso semi generati dalla funzione casuale del sistema (numeri non pseudo casuali) tramite random.SystemRandom(). Memorizzo i numeri SystemRandom nei file e li rileggo quando è necessario un seed in una simulazione. di generare semi:

import random 
myrandom = random.SystemRandom 
x = myrandom.random  # yields a number in [0,1) 
dump x out to file... 

Poi, quando sono necessari semi

import random 
read x from file... 
newseed = int(x*(2**31)) # produce a 32 bit integer 
random.seed(newseed) 
nextran = random.random() 
nextran = random.random()... 
+0

Puoi descrivere come hai misurato la somiglianza? –

+0

Non riesco ad entrare nella mia particolare applicazione, ma il risultato era quasi l'opposto di simili: numeri casuali vicini (alcune chiamate a parte) erano leggermente negativamente correlati nel fatto che se uno era inferiore a qualche piccolo numero (~ 0,01), allora i successivi erano meno che casualmente probabilmente anche meno di quel piccolo numero. Non ho fatto test approfonditi e potrei aver saltato la pistola qui, ma c'era una tendenza costante in più istanze di un gran numero di simulazioni con semi sequenziali. – BugFinder