2012-06-05 12 views
5

Używam kolejnych nasion (1,2,3,4, ...) do generowania liczb losowych w symulacji. Czy fakt, że nasiona są blisko siebie, również generuje wygenerowane liczby pseudolosowe?Nasiona bliskie w generowaniu liczb losowych mogą dawać podobne liczby losowe?

myślę, że to niczego nie zmienia, ale używam Python

Edit: Zrobiłem kilka testów i liczby nie wyglądają podobnie. Obawiam się jednak, że podobieństwa nie można zauważyć po prostu patrząc na liczby. Czy istnieje jakaś teoretyczna cecha generowania liczb losowych, która gwarantuje, że różne nasiona dają całkowicie niezależne liczby pseudolosowe?

+2

Co można zrobić, jeśli nie ufasz RNG (trochę hack, przyznaję) ma przechodzić przez materiał siewny algorytm SHA1 z 'hashlib'; to ma na celu odwzorowanie podobnych wartości na zupełnie odmienne. –

+0

Zauważyłem ten efekt, ale myślę, że było to w Microsoft C++, a nie w Pythonie. Wierzę, że moduł "losowy" używa lepszych algorytmów. –

Odpowiedz

2

Zdecydowanie będzie korelacja między nasionami a losowymi liczbami wygenerowanymi z definicji. Pytanie brzmi, czy algorytm randomizacji jest wystarczający do uzyskania wyników, które wydają się nieskorelowane, i powinieneś przestudiować metody oceny losowości, aby odpowiedzieć na to pytanie.

Masz rację, ale się martwić. Oto wyniki z C++ rand funkcji Microsoft z wartości materiału siewnego od 0 do 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' jest notorycznie niewiarygodny na niektórych platformach. Moduł "losowy" Pythona wykorzystuje algorytm Mersenne Twister, który jest uważany za niewystarczająco dobry dla crypto, ale o wiele lepszy niż większość implementacji 'rand'. –

0

Po pierwsze: zdefiniuj podobieństwo. Dalej: zakoduj test podobieństwa. Następnie: sprawdź podobieństwo.

Tylko z niewyraźnym opisem podobieństwa trudno jest to sprawdzić.

0

Jakiego rodzaju symulacji robisz?

Do celów symulacji argument jest poprawny (w zależności od rodzaju symulacji), ale jeśli implementujesz go w środowisku innym niż symulacja, może zostać łatwo zhakowany, jeśli wymaga ochrony środowiska w oparciu o wygenerowane liczby losowe.

Jeśli symulujesz wynik maszyny, czy jest ona szkodliwa dla społeczeństwa, czy nie, wynik Twoich wyników nie będzie akceptowalny. Wymaga to maksymalnej losowości w każdy możliwy sposób i nigdy nie zaufałbym twojemu rozumowaniu.

0

Cytując dokumentację z modułu losowej:

generalny na bazowym rdzenia generator Mersenne Twister:

  • Okres wynosi 2 ** 19937-1.
  • Jest to jeden z najszerzej przetestowanych generatorów.

Byłbym bardziej zaniepokojony mój kod łamane niż mój RNG nie jest wystarczająco losową. Ogólnie, twoje intuicje związane z przypadkowością będą złe - ludzki umysł jest naprawdę dobry w znajdowaniu wzorców, nawet jeśli nie istnieją.

Tak długo, jak wiesz, że twoje wyniki nie będą "bezpieczne" z powodu braku losowego siewu, powinieneś być w porządku.

+0

Przepraszam, co masz na myśli mówiąc: "twoje wyniki nie będą" bezpieczne "z powodu twojego braku losowego siewu"? Co masz na myśli przez "bezpieczny"? Czy rzeczywiście mówisz, że nie jest to bezpieczne z powodu mojego sekwencyjnego wysiewu? Wydaje się być sprzeczne z tym, co powiedziałeś wcześniej o tym, że moduł losowy jest wiarygodny ... –

+0

@Homero: Mam na myśli to, że jeśli używasz tej przypadkowości do jakichkolwiek celów bezpieczeństwa, jesteś podatny na każdą osobę, która zna twoją metodę wysiewu . Jeśli, OTOH, prowadzisz jakąś symulację i chcesz uzyskać powtarzalne wyniki, powinieneś uzyskać "wystarczającą" losowość. –

+1

-1, ponieważ pytanie dotyczyło tego, w jaki sposób sekwencja skorelowanych nasion wpływa na jakość generowanych liczb losowych, a nie na jakość liczb losowych, gdy opiera się na pojedynczym ziarnie. To pytanie jest istotne, na przykład podczas tworzenia wielu różnych generatorów (może po jednym na wątek) na początku programu wielowątkowego. Chcesz uniknąć skorelowanych wyników wśród generatorów. Myślę, że odpowiedź @ rossum to dobry sposób na zrobienie tego. –

2

Jeśli martwisz się o kolejne nasiona, nie używaj kolejnych nasion. Skonfiguruj główny RNG, ze znanym nasieniem, a następnie pobieraj kolejne sygnały wyjściowe z tego wzorca RNG, aby wysiać różne potomne RNG w razie potrzeby.

Ponieważ znasz początkowe nasienie dla wzorcowego RNG, cała symulacja może zostać uruchomiona ponownie, dokładnie tak, jak poprzednio, jeśli jest to wymagane.

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

childRNGs[] <- array of child RNGs 

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

Nie jestem pewien, czy to jest dobry pomysł, ponieważ ryzykujesz duplikowanie nasion. Na przykład byłoby to bardzo prawdopodobne, jeśli generujesz 16-bitowe liczby i uruchamiasz tysiące procesów. – Will

+0

Pytanie dotyczy kolejnych nasion, a nie duplikatów nasion. Jeśli duplikowanie nasion jest problemem, użyj 128-bitowego szyfru blokowego i zaszyfruj liczby 0, 1, 2, 3, ... 2^128-1. Będąc szyfrem, numery są gwarantowane, aby nie powielać przez bardzo długi czas, dopóki licznik nie przewróci się. Inny klucz da inną permutację liczb. Aby powielić permutację, użyj tego samego klucza. – rossum

1

że znalazły się zmierzyć, ale mała, korelacje liczb losowych generowane z Mersenne Twister gdy sekwencyjne nasiona różnych symulacji - wyniki, które uśredniono, otrzymując wyniki końcowe. W pythonie na linuksie korelacje znikają, jeśli użyję nasion generowanych przez systemową funkcję losową (liczby inne niż pseudolosowe) przez random.SystemRandom(). Przechowuję numery SystemRandom w plikach i odczytuję je, gdy w symulacji potrzebny jest materiał siewny. do generowania nasiona:

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

Wtedy, gdy są potrzebne nasiona

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

Czy możesz opisać, jak mierzysz podobieństwo? –

+0

Nie mogę dostać się do mojego konkretnego wniosku, ale wynik był prawie przeciwieństwem podobnych - pobliskie liczby losowe (kilka oddzielnych połączeń) były lekko ujemnie skorelowane w tym, że jeśli jeden był mniejszy niż niewielka liczba (~ 0,01), potem kilka następnych było mniej niż przypadkowo prawdopodobne, że również będzie mniej niż ta mała liczba. Nie przeprowadzałem rozległych testów i mogłem tutaj przeskoczyć, ale w wielu przypadkach była duża tendencja do symulacji z sekwencyjnymi nasionami. – BugFinder