Dlaczego runif nie generuje zawsze tego samego wyniku?

11

Dlaczego generatory liczb losowych, takie jak runif()w R, nie generują za każdym razem tego samego wyniku?

Na przykład:

X <- runif(100)
X

generuje różne wyniki za każdym razem.

Jaki jest powód generowania różnych wyników za każdym razem?

Jakie funkcje działa w tle, aby to zrobić?

Himabindu Kunani
źródło
3
Jednym ze sposobów, aby o tym pomyśleć, jest zadać sobie pytanie: „czy chcesz, aby generator liczb losowych generował te same liczby za każdym razem?”
shadowtalker
2
@ssdecontrol: Patrz Dilbert
Henry
2
Lub xkcd
Henry

Odpowiedzi:

18

W istocie nie jest to tak naprawdę tylko pytanie R. bardziej ogólnie dotyczy generowania liczb losowych.

Liczby „losowe” są bardzo ważne w wielu częściach statystyki. Potrzebujemy wygenerowanych wartości losowych, aby mieć określone właściwości, i (zwykle) wiele wysiłku poświęca się konstruowaniu generatorów liczb losowych i sprawdzaniu ich właściwości.

Chodzi o to, że chcemy uzyskać ciąg wartości, które są dobrym proxy dla faktycznie liczb losowych. Zwykłym koniem roboczym generowania liczb losowych jest rozkład równomierny (z tego konstruujemy inne, takie jak liczby losowe Gaussa).

Tak więc (najczęściej) algorytm numeryczny jest używany do konstruowania sekwencji liczb całkowitych, z których każda jest pod względem funkcji poprzednich. Te liczby całkowite są następnie skalowane do wartości od 0 do 1 (zwykle ).[0,1)

Na przykład wielu po prostu pracuje nad poprzednim:

x1=fa(x0)z1=x1/mx2)=fa(x1)z2)=x2)/mx3)=fa(x2))z3)=x3)/m

xzfa

x0

x3)

Zobacz ?runifw R, a zauważysz, że wyjaśnia on istnienie losowego ziarna, wraz z linkiem do pomocy na ten temat, ?.Random.seedktóry wyjaśnia dużą liczbę generatorów liczb losowych dostępnych w R (możesz nawet podać własne). Ta sama strona pomocy wyjaśnia, że ​​jeśli nie użyłeś generowania liczb losowych przed ani nie ustawiłeś materiału siewnego, na początek ziarno jest pobierane z zegara, a następnie zapisywana jest poprzednia wartość (aby następna otrzymana liczba losowa była ten sam, który uzyskałbyś, gdybyś wygenerował jeszcze jedną wartość ostatnim razem - pamięta „gdzie jesteś”.

Funkcja runifw R (podobnie jak kilka innych procedur generowania liczb losowych w innych pakietach, które zwykle mogą zrobić coś podobnego) wie o miejscu, w którym przechowywane jest ziarno liczb losowych. Wciąż aktualizuje tę wartość. Więc może działać bez konieczności jawnego przekazywania nasion, ale nadal używa jednego; jeśli go nie podałeś, po prostu używa tego, który zapisał jako ostatni.

Co do tego, dlaczego daje różne wyniki za każdym razem (jeśli nie powiesz mu, aby podawał tę samą sekwencję): robi to, ponieważ te same wartości za każdym razem byłyby zwykle bardzo nieproduktywne - nie miałyby właściwości, które się powtarzałyby miałoby to losowe próbkowanie, co czyni go mało przydatnym do celów, w których używamy generatorów liczb losowych.

Glen_b - Przywróć Monikę
źródło
14

Musisz ustawić losowe ziarno , aby za każdym razem uzyskać ten sam wynik. Użyj ? Set.seed, aby to zrobić. Rozważać:

> runif(1)
[1] 0.6467259
> runif(1)
[1] 0.2101857
> set.seed(1)
> runif(1)
[1] 0.2655087
> set.seed(1)
> runif(1)
[1] 0.2655087

Być może zainteresuje Cię przeczytanie: Powody korzystania z funkcji set.seed .

gung - Przywróć Monikę
źródło
3
Chociaż wyjaśnia to mechanikę odtwarzania zestawu wyników, wydaje się, że nie odnosi się ono do samego pytania, co zastanawia się, dlaczego tego rodzaju zachowanie nie jest automatyczne.
whuber
@ Whuber, myślę, że pytanie nie jest tutaj zdalnie dotyczące tematu. Głosowałem za natychmiastowym zamknięciem i całkowicie bym zamknął to, gdybym miał ten przywilej. Wysłałem to, aby OP nie było pustymi rękami.
gung - Przywróć Monikę
uruchamiaj „set.seed (1)” za każdym razem.
Nip