Perché runif non genera lo stesso risultato ogni volta?


11

Perché i generatori di numeri casuali come runif()in R non generano sempre lo stesso risultato?

Per esempio:

X <- runif(100)
X

sta generando output diversi ogni volta.

Qual è il motivo per generare output diversi ogni volta?

Quali funzionalità ha in background per farlo?


3
Un modo di pensarci è chiederti: "vorresti che il tuo generatore di numeri casuali generasse gli stessi numeri ogni volta?"
Shadowtalker,

2
@ssdecontrol: vedi Dilbert
Henry,

2
O xkcd
Henry,

Risposte:


18

In fondo questa non è proprio una domanda R; si riferisce alla generazione di numeri casuali più in generale.

I numeri "casuali" sono molto importanti in molte parti delle statistiche. Abbiamo bisogno dei valori casuali che generiamo per avere determinate proprietà e (di solito) ci si impegna molto per costruire generatori di numeri casuali e controllarne le proprietà.

L'idea è che vogliamo ottenere una sequenza di valori che siano un buon proxy per numeri effettivamente casuali. Il solito cavallo di battaglia per la generazione di numeri casuali è la distribuzione uniforme (da cui ne costruiamo altri, come i numeri casuali gaussiani).

[0,1)

Ad esempio, molti funzionano solo su quello precedente:

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

xzf

x0

x3

Vedi ?runifin R e noterai che spiega l'esistenza del seme casuale, con un link alla guida su ciò ?.Random.seedche spiega il gran numero di generatori di numeri casuali disponibili in R (puoi persino fornire il tuo). La stessa pagina di aiuto spiega che se non hai mai usato la generazione di numeri casuali prima o hai impostato il seed, per iniziare con il seed viene prelevato dall'orologio e quindi il valore precedente viene memorizzato (in modo che il prossimo numero casuale che ottieni sia lo stesso che avresti ottenuto se avessi generato un valore in più l'ultima volta - ricorda "dove stai facendo").

La funzione runifin R (come alcune altre routine di generazione di numeri casuali in altri pacchetti che di solito possono fare qualcosa di simile) conosce il luogo in cui viene conservato il seme di numeri casuali. Continua ad aggiornare quel valore mentre procede. Quindi può operare senza dover passare esplicitamente un seme, ma ne usa ancora uno; se non gliene hai dato uno, usa solo quello che ha salvato per ultimo.

Per quanto riguarda il motivo, dà ogni volta output diversi (se non gli dici di dare la stessa sequenza): lo fa perché gli stessi valori ogni volta sarebbero di solito molto controproducenti - non avrebbe le proprietà che si ripetevano campionamento casuale avrebbe, rendendolo non molto utile per i putposi per i quali utilizziamo generatori di numeri casuali.


14

Devi impostare il seme casuale per ottenere lo stesso risultato ogni volta. Usa ? Set.seed per farlo. Prendere in considerazione:

> 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

Potresti essere interessato a leggere questo: motivi per usare la funzione set.seed .


3
Sebbene ciò spieghi la meccanica di riproduzione di un insieme di risultati, non sembra affrontare la domanda stessa, il che si chiede perché questo tipo di comportamento non sia automatico.
whuber

@whuber, penso che la domanda non sia lontana sull'argomento qui. Ho votato per chiudere immediatamente e l'avrei chiuso completamente se avessi avuto quel privilegio. L'ho pubblicato in modo che l'OP non fosse a mani vuote.
gung - Ripristina Monica

eseguire "set.seed (1)" ogni volta.
Nip
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.