¿Por qué runif no genera el mismo resultado cada vez?

11

¿Por qué los generadores de números aleatorios como runif()en R no generan el mismo resultado cada vez?

Por ejemplo:

X <- runif(100)
X

está generando diferentes salidas cada vez.

¿Cuál es la razón para generar diferentes salidas cada vez?

¿Qué funcionalidades tiene en segundo plano para hacer esto?

Himabindu Kunani
fuente
3
Una forma de pensar en esto es preguntarse: "¿le gustaría que su generador de números aleatorios genere los mismos números cada vez?"
shadowtalker
2
@ssdecontrol: Ver Dilbert
Henry
2
O xkcd
Henry

Respuestas:

18

En el fondo, esto no es realmente solo una pregunta R; se relaciona con la generación de números aleatorios de manera más general.

Los números "aleatorios" son muy importantes en muchas partes de las estadísticas. Necesitamos los valores aleatorios que generamos para tener ciertas propiedades, y (generalmente) se requiere un gran esfuerzo para construir generadores de números aleatorios y verificar sus propiedades.

La idea es que queremos obtener una secuencia de valores que sean un buen proxy para números realmente aleatorios. El caballo de batalla habitual de la generación de números aleatorios es la distribución uniforme (a partir de eso construimos otros, como los números aleatorios gaussianos).

[0,1)

Por ejemplo, muchos simplemente trabajan en el anterior:

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

xzf

x0

x3

Vea ?runifen R y notará que explica sobre la existencia de la semilla aleatoria, con un enlace a la ayuda que ?.Random.seedexplica la gran cantidad de generadores de números aleatorios disponibles en R (incluso puede suministrar el suyo). La misma página de ayuda explica que si no ha usado la generación de números aleatorios antes o ha establecido la semilla, para comenzar con la semilla se toma del reloj, y luego se almacena el valor anterior (de modo que el siguiente número aleatorio que obtenga sea el mismo que habría obtenido si hubiera generado un valor más la última vez: recuerda "dónde está".

La función runifen R (como muchas otras rutinas de generación de números aleatorios en otros paquetes que generalmente pueden hacer algo similar) conoce el lugar donde se guarda la semilla de números aleatorios. Sigue actualizando ese valor a medida que avanza. Por lo tanto, puede funcionar sin tener que pasar explícitamente una semilla, pero aún usa una; si no le diste uno, solo usa el que guardó por última vez.

En cuanto a por qué da diferentes resultados cada vez (si no le dice que dé la misma secuencia): hace esto porque los mismos valores cada vez generalmente serían muy contraproducentes: no tendría las propiedades que se repiten tendría un muestreo aleatorio, por lo que no es muy útil para los propósitos para los que utilizamos generadores de números aleatorios.

Glen_b -Reinstate a Monica
fuente
14

Debe establecer la semilla aleatoria para obtener el mismo resultado cada vez. Use ? Set.seed para hacerlo. 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

Quizás le interese leer esto: Razones para usar la función set.seed .

gung - Restablece a Monica
fuente
3
Aunque esto explica la mecánica de reproducir un conjunto de resultados, no parece abordar la pregunta en sí, lo que se pregunta por qué este tipo de comportamiento no es automático.
whuber
@whuber, creo que la pregunta no es remotamente sobre el tema aquí. Voté para cerrar al instante y lo habría cerrado de inmediato si tuviera ese privilegio. Publiqué esto para que el OP no fuera con las manos vacías.
gung - Restablece a Monica
ejecute "set.seed (1)" cada vez.
Nip