Por que runif não gera o mesmo resultado todas as vezes?


11

Por que os geradores de números aleatórios, como runif()em R, não geram o mesmo resultado todas as vezes?

Por exemplo:

X <- runif(100)
X

está gerando saídas diferentes a cada vez.

Qual é o motivo para gerar resultados diferentes a cada vez?

Que funcionalidades existem em segundo plano para fazer isso?


3
Uma maneira de pensar sobre isso é se perguntar: "você deseja que seu gerador de números aleatórios gere sempre os mesmos números?"
shadowtalker

2
@ssdecontrol: Veja Dilbert
Henry

2
Ou xkcd
Henry

Respostas:


18

No fundo, isso não é realmente apenas uma pergunta R; relaciona-se à geração de números aleatórios de maneira mais geral.

Números "aleatórios" são muito importantes em muitas partes das estatísticas. Precisamos dos valores aleatórios que geramos para ter certas propriedades e (geralmente) muito esforço é necessário na construção de geradores de números aleatórios e na verificação de suas propriedades.

A idéia é que queremos obter uma sequência de valores que sejam um bom proxy para números realmente aleatórios. O cavalo de batalha usual da geração de números aleatórios é a distribuição uniforme (a partir da qual construímos outros, como números aleatórios gaussianos).

[0,1)

Por exemplo, muitos trabalham apenas no anterior:

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

xzf

x0

x3

Veja ?runifem R e observe que ele explica sobre a existência da semente aleatória, com um link para a ajuda sobre o ?.Random.seedque explica o grande número de geradores de números aleatórios disponíveis no R (você pode até fornecer o seu próprio). A mesma página de ajuda explica que, se você nunca usou a geração de números aleatórios antes ou configurou a semente, para começar com a semente é retirada do relógio e, a partir daí, o valor anterior é armazenado (para que o próximo número aleatório obtido seja o mesmo que você obteria se tivesse gerado mais um valor da última vez - ele lembra "onde você está fazendo").

A função runifem R (como muitas outras rotinas de geração de número aleatório em outros pacotes que geralmente podem fazer algo semelhante) sabe sobre o local onde a semente de número aleatório é mantida. Ele continua atualizando esse valor à medida que avança. Portanto, ele pode operar sem ter que receber explicitamente uma semente, mas ainda usa uma; se você não deu um, apenas usa o que salvou por último.

Quanto ao motivo pelo qual ele produz resultados diferentes a cada vez (se você não diz para dar a mesma sequência): faz isso porque os mesmos valores sempre seriam geralmente muito contraproducentes - não teriam as propriedades que se repetiam a amostragem aleatória teria, tornando-a pouco útil para as posturas para as quais usamos geradores de números aleatórios.


14

Você precisa definir a semente aleatória para obter o mesmo resultado a cada vez. Use ? Set.seed para fazer isso. Considerar:

> 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

Você pode estar interessado em ler o seguinte: Motivos para usar a função set.seed .


3
Embora isso explique a mecânica de reproduzir um conjunto de resultados, ele não parece abordar a questão em si, que se pergunta por que esse tipo de comportamento não é automático.
whuber

@ Whuber, acho que a questão não está remotamente no tópico aqui. Eu votei para fechar instantaneamente e teria encerrado imediatamente se eu tivesse esse privilégio. Publiquei isso para que o OP não fosse de mãos vazias.
gung - Restabelece Monica

execute "set.seed (1)" sempre.
Nip
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.