Generando números aleatorios manualmente

30

¿Cómo puedo generar manualmente un número aleatorio de una distribución dada, como por ejemplo, 10 realizaciones de la distribución normal estándar?

Dan ish
fuente
10
¿Puedes explicar por qué quieres hacer esto y qué otras restricciones hay para ti?
mdewey
2
Puede obtener una tabla de números aleatorios (rand utilizado para publicarlos entre otros).
Batman
44
@ Batman: sí, y el libro RAND de 10⁶ números aleatorios recibió 655 comentarios en Amazon. Todo predecible por supuesto.
Xi'an
10
(Me sorprende que nadie haya comentado esto antes) A ​​menos que sea absolutamente esencial, uno no debería tratar de usar implementaciones personalizadas para generar números aleatorios. Sí, es genial saber cómo hacerlo y probablemente sea lo primero que se te mostrará en una clase de " métodos MC " (¡y eso es genial!), Pero no lo hagas en ningún proyecto de la vida real. Las rutinas especializadas de generación de números aleatorios existen por una razón, la implementación de un algoritmo central desde cero es una pérdida de tiempo, fuente de errores y un pobre esfuerzo de conciencia de campo.
usεr11852 dice Reinstate Monic el
2
@ Xi'an: Sí, estoy de acuerdo en que es una presunción segura. Como se mencionó, esto es solo un comentario para advertir a las personas de usar su propio RNG sin darse cuenta de que el diseño de RNG es un negocio muy serio. Para citar von Neumann : "Todo el que considera métodos aritméticos para producir números aleatorios es, por supuesto, en un estado de pecado."
usεr11852 dice Reinstate Monic el

Respuestas:

46

Si "manualmente" incluye "mecánico", entonces tiene muchas opciones disponibles. Para simular una variable de Bernoulli con probabilidad de la mitad, podemos lanzar una moneda: para colas, 1 para caras. Para simular una distribución geométrica podemos contar cuántos lanzamientos de monedas son necesarios antes de obtener caras. Para simular una distribución binomial, podemos lanzar nuestra moneda n veces (o simplemente lanzar n monedas) y contar las caras. La "quincunx" o la "máquina de frijoles" o la "caja de Galton" es una alternativa más cinética. ¿Por qué no poner una en acción y comprobarlo usted mismo ? Parece que no hay tal cosa como una "moneda ponderada"01nnpero si deseamos variar el parámetro de probabilidad de nuestra variable de Bernoulli o binomial a valores distintos de , la aguja de Georges-Louis Leclerc, Comte de Buffon nos permitirá hacerlo. Para simular la distribución uniforme discreta en { 1 , 2 , 3 , 4 , 5 , 6 } tiramos un dado de seis lados. Los fanáticos de los juegos de rol habrán encontrado dados más exóticos , por ejemplo, dados tetraédricos para muestrear uniformemente de { 1 , 2 , 3 , 4 }p=0.5{1,2,3,4,5,6}{1,2,3,4}, mientras que con una ruleta o ruleta se puede ir aún más lejos. ( Crédito de la imagen )

Variedad de dados

¿Tendríamos que estar locos para generar números aleatorios de esta manera hoy, cuando está a solo un comando de distancia en una consola de computadora o, si tenemos una tabla adecuada de números aleatorios disponibles, una incursión en los rincones más polvorientos de la estantería? Bueno, tal vez, aunque hay algo agradablemente táctil en un experimento físico. Pero para las personas que trabajaban antes de la Era de la Computación, de hecho antes de las tablas de números aleatorios a gran escala ampliamente disponibles (de las cuales más adelante), la simulación de variables aleatorias manualmente tenía más importancia práctica. Cuando Buffon investigó la paradoja de San Petersburgo- el famoso juego de lanzamiento de monedas en el que la cantidad que el jugador gana se duplica cada vez que se lanza una cara, el jugador pierde en la primera cola y cuya recompensa esperada es infinitamente intuitiva: necesitaba simular la distribución geométrica con . Para hacerlo, parece que contrató a un niño para lanzar una moneda para simular 2048 jugadas del juego de San Petersburgo, registrando cuántos lanzamientos antes de que terminara el juego. Esta distribución geométrica simulada se reproduce en Stigler (1991) :p=0.5

Tosses Frequency
1      1061
2      494
3      232
4      137
5      56
6      29
7      25
8      8
9      6

En el mismo ensayo donde publicó esta investigación empírica sobre la paradoja de San Petersburgo, Buffon también presentó la famosa " aguja de Buffon ". Si un plano se divide en tiras por líneas paralelas separadas por una distancia , y una aguja de longitud l d cae sobre él, la probabilidad de que la aguja cruce una de las líneas es de 2 ldld .2lπd

El experimento de la aguja de Buffon

La aguja de Buffon puede, por lo tanto, usarse para simular una variable aleatoria oXBinomial(n,2lXBernoulli(2lπd), y podemos ajustar la probabilidad de éxito alterando las longitudes de nuestras agujas o (quizás más convenientemente) la distancia a la que gobernamos las líneas. Un uso alternativo de las agujas de Buffon es una forma terriblemente ineficiente de encontrar una aproximación probabilística paraπ. La imagen (crédito) muestra 17 fósforos, de los cuales 11 cruzan una línea. Cuando la distancia entre las líneas regladas se establece igual a la longitud del fósforo, como aquí, la proporción esperada de cruce de fósforos es2XBinomial(n,2lπd)π y por lo tanto podemos estimar π como dos veces el recíproco de la fracción observada: aquí obtenemos π =2172ππ^. En 1901 Mario Lazzarini afirmó haber realizado el experimento utilizando 2,5 agujas cm con las líneas 3 cm entre sí, y después de 3408 lanzamientos obtuvieron π =355π^=217113.1 . Este es un racional conocido paraπ, con precisión de seis decimales. Badger (1994) proporciona evidencia convincente de que esto fue fraudulento, y no menos importante para tener una confianza del 95% de seis cifras decimales de precisión utilizando el aparato de Lazzarini, ¡se deben arrojar 134 billones de agujas que agotan la paciencia! Ciertamente, la aguja de Buffon es más útil como generador de números aleatorios que como método para estimarπ.π^=355113ππ


Nuestros generadores hasta ahora han sido decepcionantemente discretos. ¿Qué pasa si queremos simular una distribución normal? Una opción es obtener dígitos aleatorios y usarlos para formar buenas aproximaciones discretas a una distribución uniforme en , luego realizar algunos cálculos para transformarlos en desviaciones normales aleatorias. Una rueda giratoria o de ruleta podría dar dígitos decimales de cero a nueve; un dado puede generar dígitos binarios; Si nuestras habilidades aritméticas pueden hacer frente a una base más funky, incluso un juego estándar de dados funcionaría. Otras respuestas han cubierto este tipo de enfoque basado en la transformación con más detalle; Aplazo cualquier discusión posterior hasta el final.[0,1]

A fines del siglo XIX, la utilidad de la distribución normal era bien conocida, por lo que había estadísticos interesados ​​en simular desviaciones normales aleatorias. Huelga decir que largos cálculos manuales no habrían sido adecuados, excepto para configurar el proceso de simulación en primer lugar. Una vez que se estableció, la generación de los números aleatorios tuvo que ser relativamente rápida y fácil. Stigler (1991) enumera los métodos empleados por tres estadísticos de esta época. Todos estaban investigando técnicas de suavizado: las desviaciones normales aleatorias eran de evidente interés, por ejemplo, para simular errores de medición que debían suavizarse.

El notable estadístico estadounidense Erastus Lyman De Forest estaba interesado en suavizar las tablas de vida y encontró un problema que requería la simulación de los valores absolutos de las desviaciones normales. En lo que demostrará ser un tema recurrente, De Forest realmente estaba tomando muestras de una distribución medio normal . Además, en lugar de utilizar una desviación estándar de uno ( estamos acostumbrados a llamar "estándar"), De Forest quería un "error probable" (desviación media) de uno. Esta fue la forma dada en la tabla de "Probabilidad de errores" en los apéndices de "Un manual de astronomía esférica y práctica, Volumen II" porZN(0,12)William Chauvenet . De esta tabla, De Forest interpoló los cuantiles de una distribución medio normal, de a p = 0.995 , que consideró "errores de igual frecuencia".p=0.005p=0.995

Tabla de errores de Forest de igual frecuencia

Si desea simular la distribución normal, siguiendo a De Forest, puede imprimir esta tabla y cortarla. De Forest (1876) escribió que los errores "se han inscrito en 100 bits de cartón de igual tamaño, que se sacudieron en una caja y se extrajeron uno por uno".

El astrónomo y meteorólogo Sir George Howard Darwin (hijo del naturalista Charles) dio un giro diferente a las cosas, al desarrollar lo que llamó una "ruleta" para generar desviaciones normales al azar. Darwin (1877) describe cómo:

Se graduó radialmente un trozo de tarjeta circular, de modo que una graduación marcada fue 720xgrados de distancia de un radio fijo. La tarjeta se hizo girar alrededor de su centro cerca de un índice fijo. Luego se hizo girar varias veces, y al detenerlo se leyó el número opuesto al índice. [Darwin agrega en una nota al pie: es mejor detener el disco cuando está girando tan rápido que las graduaciones son invisibles, en lugar de dejar que siga su curso.] Por la naturaleza de la graduación, los números así obtenidos ocurrirán exactamente de la misma manera que ocurren errores de observación en la práctica; pero no tienen signos de suma o resta con prefijo. A continuación, lanzando una moneda una y otra vez y pidiendo cabezas+y cola-, los signos720π0xex2dx+ o - se asignan por casualidad a esta serie de errores.+

El "índice" debe leerse aquí como "puntero" o "indicador" (cf "dedo índice"). Stigler señala que Darwin, como De Forest, estaba usando una distribución acumulativa medio normal alrededor del disco. Posteriormente, usar una moneda para adjuntar un signo al azar hace que esta sea una distribución normal completa. Stigler señala que no está claro cuán finamente se graduó la escala, pero presume que la instrucción para detener manualmente el giro a mitad del disco fue "disminuir el sesgo potencial hacia una sección del disco y acelerar el procedimiento".

Sir Francis Galton , por cierto un primo medio de Charles Darwin, ya ha sido mencionado en relación con su quincunx. Si bien esto simula mecánicamente una distribución binomial que, según el teorema de De Moivre-Laplace, tiene una semejanza sorprendente con la distribución normal (y ocasionalmente se usa como una ayuda didáctica para ese tema), Galton realmente produjo un esquema mucho más elaborado cuando lo deseaba. muestra de una distribución normal. Incluso más extraordinario que los ejemplos no convencionales en la parte superior de esta respuesta, Galton desarrolló dados distribuidos normalmente- o más exactamente, un conjunto de dados que producen una excelente aproximación discreta a una distribución normal con una desviación media de uno. Estos dados, que datan de 1890, se conservan en la Colección Galton del University College London.

Dados normales de galton

En un artículo de 1890 en Nature Galton escribió que:

Como instrumento para seleccionar al azar, no he encontrado nada superior a los dados. Es muy tedioso barajar bien las cartas entre cada sorteo sucesivo, y el método de mezclar y remover bolas marcadas en una bolsa es aún más tedioso. Un teetotum o alguna forma de ruleta es preferible a estos, pero los dados son mejores que todos. Cuando se sacuden y se arrojan a una canasta, se lanzan de manera tan diversa uno contra el otro y contra las costillas del trabajo de canasta que se vuelven locos, y sus posiciones al principio no brindan una pista perceptible de lo que serán, incluso después de un solo buen batido y tirar. Las posibilidades que ofrece un dado son más variadas de lo que comúnmente se supone; hay 24 posibilidades iguales, y no solo 6, porque cada cara tiene cuatro bordes que pueden utilizarse, como mostraré.

+114 4

Diseño de dados normales de Galton

El Laboratorio de experimentos estadísticos matemáticos de Raazesh Sainudiin incluye un proyecto estudiantil de la Universidad de Canterbury, Nueva Zelanda, que reproduce los dados de Galton . El proyecto incluye la investigación empírica de tirar los dados muchas veces (incluido un CDF empírico que parece tranquilizadoramente "normal") y una adaptación de los puntajes de los dados para que sigan la distribución normal estándar. Usando los puntajes originales de Galton, también hay un gráfico de la distribución normal discreta que siguen los puntajes de los dados.

Distribución discreta de los dados de Galton


A gran escala, si estás preparado para estirar lo "mecánico" a lo eléctrico, ten en cuenta que el épico A Million Random Digits de RAND con 100,000 desviaciones normales se basó en una especie de simulación electrónica de una ruleta. Del informe técnico (por George W. Brown, originalmente en junio de 1949) encontramos:

Motivados así, la gente de RAND, con la asistencia del personal de ingeniería de Douglas Aircraft Company, diseñó una rueda de ruleta electrónica basada en una variación de una propuesta hecha por Cecil Hastings. Para los propósitos de esta charla bastará una breve descripción. Una fuente de pulso de frecuencia aleatoria fue activada por un pulso de frecuencia constante, aproximadamente una vez por segundo, proporcionando en promedio aproximadamente 100,000 pulsos en un segundo. Los circuitos de estandarización de pulso pasaron los pulsos a un contador binario de cinco lugares, de modo que, en principio, la máquina es como una ruleta con 32 posiciones, haciendo un promedio de aproximadamente 3000 revoluciones en cada turno. Se utilizó una conversión de binario a decimal, arrojando 12 de las 32 posiciones, y el dígito aleatorio resultante se introdujo en un punzón de IBM, produciendo tablas de dígitos aleatorios.

χ2Las pruebas de las frecuencias de dígitos pares e impares revelaron que algunos lotes tenían un ligero desequilibrio. Esto fue peor en algunos lotes que en otros, lo que sugiere que "la máquina se había estado agotando en el mes desde su puesta a punto ... Las indicaciones indican que esta máquina requería un mantenimiento excesivo para mantenerla en perfecto estado". Sin embargo, se encontró una forma estadística de resolver estos problemas:

En este punto, teníamos nuestro millón original de dígitos, 20,000 tarjetas IBM con 50 dígitos en una tarjeta, con el sesgo impar pero pequeño perceptible revelado por el análisis estadístico. Ahora se decidió volver a aleatorizar la mesa, o al menos alterarla, con una pequeña ruleta jugando con ella, para eliminar el sesgo impar-par. Agregamos (mod 10) los dígitos de cada tarjeta, dígito a dígito, a los dígitos correspondientes de la tarjeta anterior. La tabla derivada de un millón de dígitos se sometió a las diversas pruebas estándar, pruebas de frecuencia, pruebas en serie, pruebas de póker, etc. Estos millones de dígitos tienen un estado de salud limpio y se han adoptado como la tabla moderna de dígitos aleatorios de RAND.

Había, por supuesto, buenas razones para creer que el proceso de adición haría algo bueno. De manera general, el mecanismo subyacente es el enfoque limitante de sumas de variables aleatorias módulo del intervalo unitario en la distribución rectangular, de la misma manera que las sumas no restringidas de variables aleatorias se acercan a la normalidad. Este método ha sido utilizado por Horton y Smith, de la Comisión de Comercio Interestatal, para obtener algunos buenos lotes de números aparentemente aleatorios de lotes más grandes de números mal no aleatorios.

[0 0,1]tu[0 0,1]FF-1(tu)

Zigurat para la mitad de lo normal

Referencias


()"Cualquiera que considere métodos aritméticos para producir dígitos aleatorios está, por supuesto, en un estado de pecado. Porque, como se ha señalado varias veces, no existe un número aleatorio, solo hay métodos para producir números aleatorios , y un procedimiento aritmético estricto, por supuesto, no es tal método ".

Lepisma
fuente
55
Debes estar bromeando ... (pero sí, eso es realmente manual +1)
nalzok
8
¡Cuánto trabajo invertiste en esto!
Richard Hardy el
3
Tenga en cuenta que los dados no estándar pueden ser injustos, por lo que es bueno probarlos primero, por ejemplo, youtube.com/watch?v=VI3N4Qg-JZM
Tim
2
@RichardHardy Paradójicamente, en realidad es más fácil para mí tener todo esto escrito mientras está frente a mí, y al menos temporalmente alojado en mi memoria, ¡que tratar de llevarlo todo en mi cabeza!
Silverfish
2
En cualquier caso, ¡me parece impresionante!
Richard Hardy
44

X=-2Iniciar sesiónU1cos(2πU2)
Y=-2Iniciar sesiónU1pecado(2πU2)X

Por ejemplo, en mi sistema operativo Linux, puedo verificar

$ date +%s.%N
1479733744.077762986
$ date +%s.%N
1479733980.615056616

U1=.077762986, U2=.615056616
X
> sqrt(-2*log(.077762986))*cos(2*pi*.615056616)
[1] -1.694815

Anexo: dado que el cálculo de logaritmos y cosenos puede considerarse no lo suficientemente manual , existe una variante de Box-Müller que evita el uso de esas funciones trascendentales (consulte el Ejercicio 2.9 en nuestro libro Métodos estadísticos de Monte Carlo ):

una variante de Box-Muller

Ahora, uno puede argumentar en contra de esta versión debido a las variantes exponenciales. Pero también existe una forma muy inteligente de simular esas variantes sin una llamada a funciones trascendentales , debido a von Neumann, como se resume en este algoritmo reproducido de las Variables aleatorias no uniformes de Luc Devroye :

ingrese la descripción de la imagen aquí

Es cierto que requiere el cálculo de 1 / e, pero solo una vez.

(0 0,1)2(0 0,1)(0 0,2π)

Usar el CLT para aproximar la normalidad ciertamente no es un método que recomendaría, ya que (1) todavía necesita otras variantes para alimentar el promedio, por lo que también puede usar uniformes en el algoritmo de Box-Müller, y (2) la precisión crece bastante lentamente con el número de simulaciones. Especialmente si se usa una variable aleatoria discreta como el resultado de un dado, incluso con más de seis caras . Para citar de Thomas et al. (2007), una encuesta sobre los pros y los contras de los generadores aleatorios gaussianos:

El teorema del límite central, por supuesto, es un ejemplo de un método "aproximado", incluso si se usa la aritmética perfecta, para K finita la salida no será gaussiana.

Aquí hay un experimento rápido para ilustrar el problema: generé 100 veces el promedio de 30 resultados de dado:

dies=apply(matrix(sample(1:6,30*100,rep=TRUE),ncol=30),1,mean)

luego normalizó esos promedios en media cero - la varianza uno varía

stdies=(dies-3.5)/sqrt(35/12/30)

y observó el ajuste normal [o la falta del mismo] de esta muestra:

qqnorm (stdies, col = "gold2", pch = 19); abline (a = 0, b = 1, col = "steelblue", lwd = 2, lty = 2)

dies76/30122/30reyo

U=yo=1kreyo-16 6yo
con k=15 (tenga en cuenta que 6¹⁵> 10¹¹, por lo tanto, genero más de 11 dígitos verdaderamente aleatorios), y luego aplique la transformación de Box-Müller anterior para convertir pares de uniformes en pares de N (0,1) variantes,
dies=matrix(apply(matrix(sample(0:5,15*200,rep=TRUE),nrow=15)/6^(1:15),2,sum),ncol=2) 
norma=sqrt(-2*log(dies[,1]))*c(cos(2*pi*dies[,2]),sin(2*pi*dies[,2]))

el ajuste es tan bueno como se puede esperar para una muestra Normal de tamaño 200 (simplemente trace otra para una muestra normal verdadera norma=rnorm(100)):

ingrese la descripción de la imagen aquí

como lo demuestra una prueba de Kolmogorov-Smirnov:

> ks.test(norma,pnorm)

        One-sample Kolmogorov-Smirnov test

data:  norma
D = 0.06439, p-value = 0.3783
alternative hypothesis: two-sided
Xi'an
fuente
3

Esto no es exactamente al azar, pero debería estar lo suficientemente cerca, ya que parece querer un experimento aproximado.

Use su teléfono para configurar un cronómetro. Después de unos buenos 10 segundos, deténgalo (cuanto más espere, más se acercará a un resultado verdaderamente "aleatorio", pero 10 segundos están bien). Tome los últimos dígitos (por ejemplo, 10.67 segundos le dará 67). Aplicar la tabla de percentiles para la distribución normal. En este ejemplo, solo tiene que buscar 0.67 y encontrará el número. En este caso, su valor es de aproximadamente 0,45. Esto no es perfectamente preciso, pero le dará una estimación sólida.

Si obtiene menos de 50, simplemente haga 100- [Su resultado] y use la tabla. Su resultado será el mismo, con un signo menos, debido a la simetría de N (0,1).

Thalantas
fuente
3

Volteemos una moneda imparcial norteveces. Comenzando en cero, contamos+1 si cabezas -1si colas Despuésnorte lanzamientos de monedas, dividimos el contador por norte. Usando el teorema del límite central , sinorte es lo suficientemente grande, entonces deberíamos tener una "realización aproximada" del gaussiano normalizado norte(0 0,1).


¿Por qué? Dejar

Xk: ={+1 Si k-th flip coin es cara-1 Si k-el lanzamiento de moneda es colas

ser iid Bernoulli variables aleatorias con PAGS(Xk=±1)=12. Por lo tanto,

mi(Xk)=0 0Var(Xk)=1

Dejar Y: =X1+X2++Xnorte. Por lo tanto,

mi(Y)=0 0Var(Y)=norte

Normalizando,

Z: =Ynorte

obtenemos una variable aleatoria con varianza unitaria

mi(Z)=0 0Var(Z)=1
Rodrigo de Azevedo
fuente
1
Como se discutió en mi respuesta, me temo que el CLT no es un uso eficiente de la aleatoriedad en los lanzamientos de monedas: se explotarían mejor como dígitos binarios de una variante pseudoaleatoria U (0,1) con precisión simple o doble.
Xi'an
@ Xi'an Leí tu respuesta antes de publicar la mía, y tu objeción al CLT parecía estar basada en una convergencia lenta. Dado que este es un experimento mental, lanzar una moneda 10 mil millones de veces no cuesta nada. Y realmente es un procedimiento manual que no requiere computadoras, ni cálculo de logaritmos, raíces cuadradas o cosenos. Claro, uno podría usar una regla de cálculo, pero eso puede estar yendo demasiado lejos.
Rodrigo de Azevedo
1
:}}: ¡10 mil millones de monedas no me parecen muy manuales ...!
Xi'an el
Manual = a mano. Calcular a mano los logaritmos y cosenos también lleva tiempo.
Rodrigo de Azevedo
0

Vale la pena señalar que una vez que puede generar un uniforme (0,1), puede generar cualquier variable aleatoria para la cual el cdf inverso es calculable simplemente conectando la variable aleatoria uniforme en el CDF inverso.

Entonces, ¿cómo podría uno calcular un uniforme (0,1) manualmente? Bueno, como mencionó @Silverfish, hay una variedad de dados utilizados por los jugadores tradicionales de rol. Uno de los cuales es un dado de diez lados. Asumiendo que este es un dado justo, ahora podemos generar un uniforme discreto (0, 9).

También podemos usar este uniforme (0,9) para representar un solo dígito de una variable aleatoria. Entonces, si usamos dos dados, obtenemos una variable aleatoria uniforme que puede tomar valores0,01,0,02,...,0,99,1.00. Con tres dados, podemos obtener una distribución uniforme en0.001,0.002,...,0,999,1.000.

Por lo tanto, podemos acercarnos mucho a un uniforme continuo (0,1) aproximándolo con una distribución uniforme discreta finamente cuadriculada con unos pocos dados de 10 lados. Esto se puede conectar a un CDF inverso para producir la variable aleatoria de interés.

Acantilado
fuente