13 votos

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

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

Por ejemplo:

X <- runif(100)
X

es la generación de salidas diferentes cada vez.

¿Cuál es la razón para la generación de salidas diferentes en cada momento?

¿Qué funciones tiene sucediendo en el fondo para hacer esto?

20voto

AdamSane Puntos 1825

En el corazón esto no es realmente una R de que se trate; que se refiere a la generación de números aleatorios de forma más general.

"Al azar" los números son muy importantes en muchas partes de estadísticas. Necesitamos los valores aleatorios generamos a tener ciertas propiedades, y (generalmente) una gran cantidad de esfuerzo en la construcción de generadores de números aleatorios y la comprobación de sus propiedades.

La idea es que queremos obtener una secuencia de valores que son una buena aproximación de la realidad, los números aleatorios. La costumbre caballo de batalla de la generación de números aleatorios es la distribución uniforme (de la que construimos otros, como el de Gauss números aleatorios).

Así que (normalmente) un algoritmo numérico se utiliza para generar una secuencia de números enteros, cada uno en términos de algunas de las funciones de los anteriores. Estos enteros se escala a estar entre 0 y 1 (usualmente $[0,1)$ ).

Por ejemplo, muchos sólo trabajan en el anterior:

$$x_1=f(x_0)\hspace{1cm}z_1=x_1/m\\ x_2=f(x_1)\hspace{1cm}z_2=x_2/m\\ x_3=f(x_2)\hspace{1cm}z_3=x_3/m\\ \vdots$$

... where the $x$'s are integers, the $z$'s are then scaled to be in the unit interval, and $f$ is some often complicated but usually fast function that operates on the bits in its argument to produce a new set of bits that (hopefully) don't seem to be related to any previous values (if we look at them in all manner of ways, even quite carefully -- even though they really are related, since that's how they're made). These have to be constructed carefully to make sure the sequence has a very long cycle and that its values are really uniform and aren't sequentially dependent in any way we might really care about (along with a host of other requirements that are usually regarded as important).

They require a starting ("seed") integer ($x_0$), which you supply (some algorithms may need more than one seed). If you use the same seed again, you get the same sequence (which is handy for being able to reproduce results). But some of the time, you just want some random numbers, and you don't care what the seed is as long as the start point is different from the previous lot you used.

So if you don't supply a seed, many packages can just make one for you. Some packages look at the last few digits on the internal digital clock (usually manipulated in some way). Some (R included) store the last value (the integer $x_3$ por encima, de manera más general, el término "estado" se utiliza para abarcar los casos en que hay más de un número de involucrados) que fue generado por el generador de números aleatorios para el uso como la siguiente semilla si no se proporciona.

Ver ?runif en R y usted nota que explica acerca de la existencia de la semilla aleatoria, con un enlace a la ayuda en que ?.Random.seed que explica el gran número de generadores de números aleatorios disponibles en R (incluso puede proporcionar su propio). La misma página de ayuda explica que si usted no ha utilizado la generación de números aleatorios antes o conjunto de la semilla, para comenzar con la semilla se toma desde el reloj, y a partir de entonces el valor anterior almacenado (de modo que el siguiente número aleatorio que conseguir sería la misma que habría obtenido si hubiera generado más valor último tiempo -- recuerda "donde estás").

La función runif R (como bastantes otros de generación de números aleatorios rutinas de otros paquetes que normalmente puede hacer algo similar) sabe sobre el lugar donde la semilla de aleatorización se mantiene. Se mantiene la actualización que el valor de lo que va. De modo que puede funcionar sin tener que explícitamente se aprobó una semilla, pero todavía se utiliza uno; si no, sólo utiliza el que se guardó por última.

14voto

Sean Hanley Puntos 2428

Usted tiene que fijar la semilla aleatoria con el fin de obtener el mismo resultado cada vez. El uso ?conjunto.semilla para hacerlo. Considere la posibilidad de:

> 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

Usted puede estar interesado en la lectura de este: Motivos para usar el conjunto.la semilla de la función.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X