40 votos

¿Qué es exactamente una semilla en un generador de números aleatorios?

Intenté algunas búsquedas habituales en Google, etc., pero la mayoría de las respuestas que encuentro son algo ambiguas o específicas de un lenguaje/biblioteca como Python o C++. stdlib.h etc. Busco una respuesta lingüística agnóstica y matemática, no los detalles de una biblioteca.

Como ejemplo, muchos dicen que la semilla es una punto de partida del generador de números aleatorios y la misma semilla siempre produce el mismo número aleatorio. ¿Qué significa esto? ¿Significa que el número de salida es una función determinante de una semilla específica, y que el azar proviene del valor de la semilla? Pero si ese es el caso, entonces al suministrar la semilla, ¿no estamos nosotros, los programadores, creando la aleatoriedad en lugar de dejar que la máquina lo haga?

Además, ¿qué hace que un punto de partida en este contexto? ¿Es esta una forma no rigurosa de decir que un elemento $x \in\mathfrak {X}$ del dominio de un mapa $f: \mathfrak {X} \rightarrow\mathfrak {Y}$ ? ¿O me estoy equivocando?

7 votos

No me siento capacitado para escribir una respuesta, pero podría encontrar el artículo de Wikipedia sobre el Giro Mersenne esclarecedor, especialmente el sección sobre la inicialización . En resumen, un generador de números pseudoaleatorios como el Mersenne Twister acabará repitiendo su salida. En el caso del MT el periodo tiene una longitud 2^19937 − 1 . La semilla es el punto de esta larguísima secuencia donde comienza el generador. Así que sí, es determinista.

5 votos

Un generador de números pseudoaleatorios es una lista fija de números que se repite sin fin. ¿Dónde empieza? Tienes que decirlo.

4 votos

@whuber En realidad creo que tu comentario sería una gran respuesta.

44voto

Aaron Puntos 36

La mayoría generadores de números pseudoaleatorios (PRNG) se basan en algoritmos que implican algún tipo de método recursivo que parte de un valor base determinado por una entrada llamada "semilla". El PRNG por defecto en la mayoría del software estadístico (R, Python, Stata, etc.) es el Algoritmo Mersenne Twister MT19937, que se recoge en Matsumoto y Nishimura (1998) . Se trata de un algoritmo complicado, así que lo mejor sería leer el artículo sobre él si se quiere saber cómo funciona en detalle. En este algoritmo en particular, hay una relación de recurrencia de grado $n$ y su semilla de entrada es un conjunto inicial de vectores $\mathbf{x}_0, \mathbf{x}_1, ..., \mathbf{x}_{n-1}$ . El algoritmo utiliza una relación de recurrencia lineal que genera:

$$\mathbf{x}_{n+k} = f(\mathbf{x}_k, \mathbf{x}_{k+1}, \mathbf{x}_{k+m}, r, \mathbf{A}),$$

donde $1 \leqslant m \leqslant n$ y $r$ y $\mathbf{A}$ son objetos que se pueden especificar como parámetros en el algoritmo. Como la semilla da el conjunto inicial de vectores (y dados otros parámetros fijos para el algoritmo), la serie de números pseudoaleatorios generados por el algoritmo es fija. Si cambias la semilla, entonces cambias los vectores iniciales, lo que cambia los números pseudoaleatorios generados por el algoritmo. Esta es, por supuesto, la función de la semilla.

Ahora bien, es importante señalar que éste es sólo un ejemplo, utilizando el algoritmo MT19937. Hay muchos PRNGs que se pueden utilizar en el software estadístico, y cada uno de ellos implica diferentes métodos recursivos, por lo que la semilla significa una cosa diferente (en términos técnicos) en cada uno de ellos. Puede encontrar una biblioteca de PRNGs para R en esta documentación que enumera los algoritmos disponibles y los documentos que los describen.

El propósito de la semilla es permitir al usuario "bloquear" el generador de números pseudoaleatorios, para permitir un análisis replicable. A algunos analistas les gusta establecer la semilla utilizando un generador de números aleatorios reales (TRNG) que utiliza las entradas de hardware para generar un número de semilla inicial, y luego lo reporta como un número bloqueado. Si el usuario original establece y comunica la semilla, un auditor puede repetir el análisis y obtener la misma secuencia de números pseudoaleatorios que el usuario original. Si la semilla no se establece, el algoritmo suele utilizar algún tipo de semilla por defecto (por ejemplo, del reloj del sistema), y generalmente no será posible replicar la aleatorización.

1 votos

+1. Sería bueno añadir lo que (normalmente) ocurre si no se proporciona explícitamente la semilla.

1 votos

@amoeba: En el 4º párrafo de mi respuesta, se habla de esto brevemente.

1 votos

Aunque esto responde a lo básico de la pregunta, no toca el hecho de por qué necesitamos esto en las simulaciones. Es muy difícil producir una aleatoriedad VERDADERA - ¡y cuando la tienes no puedes reproducir la respuesta original! Entra el PNRG... con todos sus problemas.

21voto

manku Puntos 111

En primer lugar, hay no hay verdadera aleatoriedad en los actuales "números aleatorios" generados por ordenador. Todo pseudoaleatorio generadores utilizan métodos deterministas. (Posiblemente, los ordenadores cuánticos cambiarán eso).

La difícil tarea es idear algoritmos que produzcan un resultado que no pueda distinguirse significativamente de datos procedentes de una fuente verdaderamente aleatoria.

Tienes razón en que establecer una semilla te hace partir de un punto de partida conocido en una larga lista de números pseudoaleatorios. punto de partida en una larga lista de números pseudoaleatorios. Para los generadores implementados en R, Python, etc., la lista es enormemente largo. Lo suficientemente largo como para que ni siquiera el mayor proyecto de simulación factible superará el "período del generador para que los valores comiencen a recircular.

En muchas aplicaciones ordinarias, la gente no pone una semilla. Entonces, una semilla impredecible semilla se elige automáticamente (por ejemplo, a partir de los microsegundos del reloj del sistema operativo). Los generadores pseudoaleatorios de uso general han sido sometidos a baterías de pruebas, en gran parte consistentes en problemas que han problemas que han resultado difíciles de simular con generadores anteriores insatisfactorios.

Normalmente, la salida de un generador consiste en valores que no son, para que, a efectos prácticos, no se pueden distinguir de los números elegidos realmente al azar de la distribución uniforme en $(0,1).$ Entonces esos números pseudoaleatorios se manipulan para que coincidan con los que uno obtendría muestreando al azar de otras distribuciones como la binomial, Poisson, normal, exponencial, etc.

Una prueba de un generador es ver si sus pares sucesivos en "observaciones" simulan como $\mathsf{Unif}(0,1)$ en realidad mira como si estuvieran llenando el cuadrado de la unidad al azar. El aspecto ligeramente jaspeado es el resultado de la variabilidad inherente. Sería muy sospechoso obtener un gráfico que tuviera un aspecto perfectamente uniforme gris. [En algunas resoluciones, puede haber un patrón de moiré regular; por favor cambiar la ampliación hacia arriba o hacia abajo para deshacerse de ese efecto falso si se produce].

set.seed(1776);  m = 50000
par(mfrow=c(1,2))
  u = runif(m);  plot(u[1:(m-1)], u[2:m], pch=".")
  u = runif(m);  plot(u[1:(m-1)], u[2:m], pch=".")
par(mfrow=c(1,1))

enter image description here

A veces es útil para poner una semilla. Algunos de estos usos son los siguientes siguientes:

  1. Al programar y depurar es conveniente tener una salida predecible. Así que muchos programadores ponen un set.seed al inicio de un programa hasta que se termine de escribir y depurar.

  2. Al enseñar sobre la simulación. Si quiero mostrar a los estudiantes que puedo simular las tiradas de un dado justo utilizando el sample función en R, podría hacer trampa, ejecutando muchas simulaciones, y eligiendo la que más se acerque al un valor teórico objetivo. Pero eso daría una impresión poco realista de cómo funciona realmente la simulación.

    Si establezco una semilla al principio, la simulación obtendrá siempre el mismo resultado. Los estudiantes pueden corregir su copia de mi programa para asegurarse de que da los resultados previstos. Luego pueden ejecutar simulaciones, ya sea con sus propias semillas o dejando que el programa que el programa elija su propio punto de partida.

    Por ejemplo, la probabilidad de obtener el total de 10 al lanzar dos dados justos es $$3/36 = 1/12 = 0.08333333.$$ Con un millón de experimentos con 2 dados debería obtener una precisión de dos o tres puestos. El margen de error de simulación del 95% es de aproximadamente $$2\sqrt{(1/12)(11/12)/10^6} = 0.00055.$$

    set.seed(703);  m = 10^6
    s = replicate( m, sum(sample(1:6, 2, rep=T)) )
    mean(s == 10)
    [1] 0.083456         # aprx 1/12 = 0.0833
    2*sd(s == 10)/sqrt(m)
    [1] 0.0005531408     # aprx 95% marg of sim err.
  3. Cuando se comparten análisis estadísticos que implican simulación. Hoy en día, muchos análisis estadísticos incluyen alguna simulación, por ejemplo, una prueba de permutación o un muestreador de Gibbs. Al mostrar la semilla, se permite que que lean el análisis puedan replicar los resultados con exactitud, si así lo desean.

  4. Cuando se escriben artículos académicos que implican la aleatorización. Los artículos académicos suelen pasar por varias rondas de revisión por pares. Un gráfico puede utilizar, por ejemplo, puntos salpicados aleatoriamente para reducir el exceso de gráficos. Si los análisis deben modificarse ligeramente en respuesta a los comentarios de los revisores, es bueno que un jittering particular no cambie entre las rondas de revisión, lo que podría ser desconcertante para los revisores particularmente puntillosos, por lo que se establece una semilla antes del jittering.

1 votos

Muy bien, +1. Me he tomado la libertad de añadir un cuarto punto.

1 votos

Entonces, ¿quieres decir que un generador de números pseudorromos almacena básicamente una secuencia periódica de números aleatorios (distribuidos uniformemente en [0, 1]) y que una semilla es simplemente un índice de la secuencia? Entonces, ¿significa que el número aleatorio generado es una función determinista de la semilla?

11 votos

No es necesario que el ordenador cuántico utilice los fenómenos cuánticos para tener un generador aleatorio ( es.wikipedia.org/wiki/Hardware_random_number_generator )

1voto

Paul Palmpje Puntos 101

TL;DR;

Una semilla suele permitir reproducir la secuencia de números aleatorios. En ese sentido, no son verdaderos números aleatorios, sino "números pseudoaleatorios", de ahí que sea un generador de PNR (PNRG). ¡Estos son una verdadera ayuda en la vida real!

Un poco más de detalle:

Prácticamente todos los generadores de números "aleatorios" implementados en los lenguajes informáticos son generadores de números pseudoaleatorios. Esto se debe a que, dado un valor inicial (===> la semilla), siempre proporcionarán la misma secuencia de resultados pseudoaleatorios. Un buen generador producirá una secuencia que no puede distinguirse -en términos estadísticos- de una secuencia aleatoria verdadera (lanzar un dado verdadero, una moneda verdadera, etc.).

En muchos casos de simulación se quiere tener una verdadera experiencia "aleatoria". Sin embargo, también se quiere poder reproducir los resultados. ¿Por qué? Bueno, al menos a los reguladores les interesa esa peculiaridad.

Hay mucho en lo que sumergirse. La gente incluso hace análisis sobre la "mejor" semilla aleatoria. En mi opinión, esto invalida su modelo ya que no pueden manejar el "verdadero" comportamiento aleatorio - o su PRNG no es adecuado para su implementación. La mayoría de las veces simplemente no hacen suficientes simulaciones - pero llevan tiempo.

Ahora imagina un "verdadero" RNG. Se podría implementar basándose en una especie de aleatoriedad en la máquina. Si sólo se toma una semilla aleatoria (por ejemplo, la hora actual) se crea una especie de punto de partida aleatorio, pero la aleatoriedad de la secuencia sigue dependiendo del algoritmo para determinar los siguientes números. Esto es más importante que el punto de partida en la mayoría de los casos, ya que la distribución de los resultados determina el "resultado" real. Si la secuencia debe ser realmente aleatoria, ¿cómo se implementa esto? Se puede decir que los tics del reloj de un ordenador son deterministas y, por lo demás, probablemente mostrarán mucha autocorrelación. Entonces, ¿qué se puede hacer? La mejor apuesta hasta el momento es implementar una PNRG sólida.

¿Computación cuántica? No estoy seguro de que eso lo solucione.

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