2009-10-12 15 views
10

Rozważmy kod tak (Python):Jak różne powinny być losowe nasiona?

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) 

chcę się upewnić, że randNumbers różnią się znacznie od jednego połączenia do drugiego. Czy muszę się upewnić, że liczba nasion różni się znacznie między kolejnymi połączeniami, czy też wystarcza, że ​​nasiona są różne (bez względu na sposób)?

Do pedantów: proszę sobie sprawę, powyższy kod jest super-over-uproszczone

+0

"różnią się znacznie", w kontekście generatorów liczb losowych, może oznaczać wiele różnych rzeczy. Czy istnieją konkretne testy losowości, które przeglądasz, a które nie są obecnie? Typowe PRNG mają okresy o wiele dłuższe niż 100 cyfr. Zwykle widać jedno zdarzenie inicjujące z zegara systemowego. Używanie tej samej wartości początkowej, co ty, spowoduje wygenerowanie tej samej sekwencji pseudolosowej za każdym razem. – Mikeb

+0

Czy możesz wyjaśnić, dlaczego chcesz, aby Twoje pseudolosowe liczby były znacząco różne? Czy nie jest to sprzeczne z celem liczb losowych, jeśli potrzebujesz odchyleń - z punktu widzenia statystyki, tak samo prawdopodobne jest, że dwie liczby będą zbliżać się do siebie w sekwencji, ponieważ jesteś daleko od siebie (jeśli są naprawdę przypadkowe) –

Odpowiedz

8

Krótka odpowiedź: unikaj ponownego wysiewu, ponieważ nic tu nie kupujesz. Długa odpowiedź poniżej.


Wszystko zależy od tego, czego dokładnie potrzebujesz. W dokumencie Common defects in initialization of pseudorandom number generators podano, że zależne od liniowości nasiona (z których 1, 2, 3, 4 zdecydowanie są) są złym wyborem do inicjowania wielu PRNG, przynajmniej podczas ich wykorzystywania do symulacji i pożądania nieskorelowanych wyników.

Jeśli wszystko, co robisz, to rzucanie kilkoma kośćmi lub generowanie pseudolosowego sygnału wejściowego na coś bezkrytycznego, to najprawdopodobniej nie ma to znaczenia.

Należy również zauważyć, że używanie niektórych klas samego PRNG do generowania nasion ma ten sam problem przy generowaniu liniowych liczb zależnych (LCGs przychodzą na myśl).

2

Ogólnie rzecz biorąc, tylko nasion swój generator liczb losowych, kiedy potrzeba losowe numery mają być generowane w ten sam sposób za każdym razem przez . Jest to użyteczne, gdy do przetwarzania masz losowy komponent, ale musisz go przetestować i dlatego chcesz, aby był spójny między testami. W przeciwnym razie pozwól systemowi wysiać sam generator.

Innymi słowy, poprzez zaszczepienie generatora liczb losowych specyficznymi predefiniowanymi nasionami, faktycznie zmniejsza się losowość całego systemu. Liczby losowe generowane przy użyciu nasion 1 są rzeczywiście pseudo-losowo różne od tych z nasionami 2, ale zakodowany materiał siewny spowoduje wielokrotne losowe sekwencje w każdym przebiegu programu.

0

Same nasiona powinny być losowe, aby wynik był nieprzewidywalny. Mogą występować problemy, jeśli nasiona różnią się tylko jednym lub dwoma bitami (jak pokazuje this question).

+1

Ręczne wysiewanie zwykle oznacza, że ​​dane wyjściowe nie muszą być nieprzewidywalne. A ile nasiona powinny się różnić znacznie zależy od algorytmu PRNG. – Joey

+0

Oznacza to, że dane wyjściowe nie muszą być nieprzewidywalne, ale zakłada się, że osoba pytająca rzeczywiście zdaje sobie sprawę, że zaszczepiające się generatory powodują taką samą sekwencję liczb. – Matt

+0

@Johannes: Absolutnie, ale jeśli naprawdę chcesz nieprzewidywalnych wyników, nie chcesz, aby ktoś mógł odgadnąć ziarno. Z tego powodu najlepiej jest, aby sam materiał siewny był całkowicie nieprzewidywalny (np. Z/dev/random). –

0

To zależy od aplikacji, dla której używasz PRNG. Jeśli używasz czegoś, co musi być w pełni kryptograficzne, to generalnie nasiona muszą być niezwykle trudne do dedukcji w oparciu o dane wyjściowe, różne za każdym razem, gdy aplikacja działa, trudne do odgadnięcia i niemożliwe do określenia przez odwrotną inżynierię aplikacji (tzn. nie mogą być zakodowane na sztywno).

Jeśli Twoim celem jest gra, Twoje wymagania mogą się różnić. Na przykład, jeśli kontrolujesz strategię komputera, ale strategia komputera pozostaje taka sama dla wszystkich przebiegów gry, możesz mieć łatwą do pobicia grę. Z drugiej strony możesz chcieć, aby był to tryb "łatwy".

+1

Jeśli ma to coś wspólnego z crypto, to MT19937 jest na początku bardzo złym generatorem. – Joey

1

Wygląda na to, że chcesz mieć numery pseudolosowe, które nie są pseudolosowe, z większym prawdopodobieństwem, że kolejne liczby będą "znacząco" inne niż wymaga pseudolosowość. Wątpię, czy jakikolwiek wspólny prng zrobi to, bez względu na twoją strategię szczepienia.

4

Jeśli generator liczb losowych jest wysokiej jakości, nie powinno mieć znaczenia, jak go wysiejesz. W rzeczywistości najlepszą praktyką byłoby zalanie go tylko raz.Generatory liczb losowych zaprojektowano tak, aby miały pewne zachowanie statystyczne po uruchomieniu. Częste ponowne wysyłanie skutecznie tworzy inny generator liczb losowych, który może nie być tak dobry.

Losowy wybór nasion brzmi jak dobry pomysł, ale tak nie jest. W rzeczywistości, z powodu "urodzinowego paradoksu", istnieje zaskakująco wysokie prawdopodobieństwo, że dwa razy wybierzesz to samo nasienie.

Powiązane problemy