2009-06-10 12 views
6

¿Puede decirme alguna forma de generar números aleatorios no uniformes?
Estoy usando Java pero los ejemplos de código pueden ser lo que quieras.Generando números aleatorios no uniformes

Una forma es crear una distribución asimétrica agregando dos números aleatorios uniformes (es decir, tirando 2 dados).

+0

Depende de la distribución que desee. –

Respuesta

6

¿Qué distribución de desviaciones quieres?

Aquí hay una técnica que siempre funciona, pero no siempre es la más eficiente. La función de distribución acumulativa P (x) proporciona la fracción del tiempo en que los valores caen por debajo de x. Por lo tanto, P (x) = 0 en el valor más bajo posible de xy P (x) = 1 en el valor más alto posible de x. Cada distribución tiene una CDF única, que codifica todas las propiedades de la distrubción en la forma en que P (x) se eleva de 0 a 1. Si y es una desviación uniforme en el intervalo [0,1], entonces x satisface P (x) = y se distribuirá de acuerdo a su distribución. Para que esto funcione en forma conjunta, solo necesita una forma de calcular el inverso de P (x) para su distribución.

La biblioteca Meta.Numerics define un gran número de distrubtions comúnmente utilizados (por ejemplo, normal, lognormal, exponencial, ji cuadrado, etc.) y tiene funciones para el cálculo de la CDF (Distribution.LeftProbability) y la inversa CDF (Distribution.InverseLeftProbability) de cada.

Para técnicas especializadas que son rápidas para distrubtions particulares, p. la técnica de Box-Muller para desviaciones distribuidas de forma normal, ver el libro Numerical Recipies.

+0

no importa, solo estaba buscando maneras de generar números en diferentes distribuciones. Supongo que no lo había pensado tan lejos. Parece que necesito leer un poco más, ¿es este el libro del que hablabas? Recetas numéricas 3ra edición: El arte de la computación científica –

+0

Sí, ese es el libro. Es la introducción estándar a la computación numérica, pero es una gran inversión de dinero y esfuerzo. Si solo quieres las malditas desviaciones, me quedaría con una biblioteca. Usando el que mencioné, es tan simple como: Random rng = new Random (1); Distribution dist = new NormalDistribution (1.0,2.0); double x = dist.InverseLeftProbability (rng.NextDouble()); –

+0

increíble, esto es algo de lo que me gustaría mejorar mucho con seguridad. Yo planeo revisar el libro. Muchas gracias. –

10

Intente generar números aleatorios distribuidos uniformemente, luego aplique su cumulative distribution function invertido no uniforme a cada uno de ellos.

+2

+1 Esta es la manera de hacerlo. – ralphtheninja

+0

Incorrecto, debe invertir su función de distribución. Si desea la distribución cuadrada, debe tomar raíces cuadradas de números aleatorios. – glmxndr

+0

Supongo que la función de distribución aplica la inversión adecuada. Creo que su problema es más con la terminología del tipo de distribución a la función utilizada. –

1

Si está utilizando Java, entonces mi biblioteca Uncommons Maths puede ser de su interés. Incluye clases para generar números aleatorios para distribuciones Uniforme, Gaussiana, Poisson, Binomial y Exponencial. This article muestra cómo puede usar estas distribuciones.

Cuestiones relacionadas