Necesito un generador de números aleatorios con una distribución normal, con media y desviación estándar parametrizables. Sólo tengo un generador de números aleatorios de distribución uniforme. Aplicando una transformación de Box-Muller a dos números uniformemente distribuidos en [0,1), obtengo una distribución normal estándar. Sin embargo, me he confundido sobre cómo obtener una distribución normal arbitraria y parametrizada mediante este procedimiento.
Dado que se puede utilizar una transformación z para cambiar una distribución normal no estándar en una estándar, pensé que podría simplemente utilizar la inversa de una transformación z, y pasar el resultado de los números uniformemente distribuidos transformados por Box-Muller a $(x \times \sigma) + \mu$ , donde $\sigma$ es la desviación estándar deseada y $\mu$ es la media deseada. Me he convencido de que esto es un error. Mi simulación, usando el RNG transformado no se comportó correctamente (puedo compararlo con un RNG bien probado de distribución normal), y un gráfico de la distribución transformada no parece en absoluto correcto.
Creo que lo que necesito es hacer algo con la media y la desviación estándar dentro de el código Box-Muller, en lugar de procesar su valor de retorno de forma sencilla. Sin embargo, estoy confundido acerca de cómo hacer esto.
En caso de que sea útil, aquí está mi código Box-Muller. (Está en el NetLogo lenguaje, que puede no ser familiar, pero creo que este código de bits será inteligible para cualquier persona con experiencia en programación).
to-report box-muller-random-normal [mn stddev]
if-else box-muller-cache-exists = 0 [ ; using 1 for true and 0 for false means we don't have to initialize to false in setup; just use default zero init value
; cache is unfilled, so compute new pair of values
let x1 random-float 1
let x2 random-float 1
let y1 sqrt (-2 * ln x1) * cos (2 * pi * x2)
let y2 sqrt (-2 * ln x1) * sin (2 * pi * x2)
set box-muller-cache y2
set box-muller-cache-exists 1
report y1
][
set box-muller-cache-exists 0 ; so cache will be refilled next time
report box-muller-cache
]
end
¿Dónde debo insertar las transformaciones que implican la media y la desviación estándar? ( to-report
es el comando de definición de funciones de NetLogo. El código que utiliza ...cache...
está diseñado para recordar uno de los valores entre invocaciones, generando nuevos números sólo si no hay ningún valor recordado).