2009-04-15 131 views
10

Por lo que entiendo, el generador estándar es para la distribución normal. Tengo que generar números aleatorios de acuerdo a la normal, uniforme y de Poisson Distribuciones, pero me parece que no puede encontrar una clase para la última 2.Generador de Java para Poisson y distribuciones uniformes?

tengo que generarlos en el rango de 0 - 999999.

Respuesta

5

En realidad, el standard generator es para la distribución uniforme. El generador de números aleatorios básico en cualquier idioma/biblioteca siempre (en todos los casos que conozco) usa la distribución uniforme porque eso es lo que surge de todos los populares algoritmos de generador de números pseudoaleatorios: básicamente, los números aleatorios uniformes son los más fáciles.

veo Eddie ya se apuntó a un enlace para otras distribuciones así que voy a omitir que escriben el resto de esta ...

+0

En realidad, parece que ese enlace también señala el método "nextGaussian" para crear variables normales también. – gnovice

4

déjame aclarar todo esto por el hecho de que nada de esto es realmente aleatoria, lo estoy hablando de generadores de números pseudoaleatorios.

Permítanme decir también que nunca he tenido que hacer esto para el código de calidad de producción. Sin embargo, he hecho esto para una tarea de hw, en Python. Simulé las variables aleatorias de Poisson.

La forma en que lo hice hace uso de los siguientes hechos:

  1. Una variable aleatoria de Poisson es una suma de variables aleatorias exponenciales.
  2. Podemos usar el método de transformación inversa para generar variables aleatorias exponenciales. http://en.wikipedia.org/wiki/Inverse_transform_sampling.

En particular, puede utilizar el hecho de que: si X , ..., X n son independientes variables aleatorias exponenciales estándar, entonces Z = min (k: X + ... + X k < & lambda;) - 1 es Poisson (& lambda;).

Entonces, con esto, escribí el siguiente código en Python para generar valores de Poisson:

uso
class Poisson: 
    """Generate Poisson(lambda) values by using exponential 
    random variables.""" 

    def __init__(self, lam): 
     self.__lam = lam 

    def nextPoisson(self): 
     sum = 0 
     n = -1 
     while sum < self.__lam: 
      n += 1 
      sum -= math.log(random.random()) 
     return n 

Ejemplo de la clase es:

# Generates a random value that is Poisson(lambda = 5) distributed 
poisson = Poisson(5) 
poisson_value = poisson.nextPoisson 

he publicado esto aquí porque es bueno saber que existen este tipo de relaciones, y este método de transformación inversa le proporciona una forma general de tratar con la generación de valores aleatorios siguiendo una distribución continua particular.

+0

He arreglado el formato de la lista numerada a lo que creo que pretendía. Si esto no es lo que pretendía, entonces, por supuesto, puede deshacer el cambio. – Eddie

12

Como ha señalado David, el generador de números pseudoaleatorio suministrado utiliza la distribución Uniforme.

Para los otros dos, me gustaría utilizar las funciones Cern Colt biblioteca:

Estas funciones de biblioteca permiten fácilmente a encontrar un número aleatorio extraído de cada distribución, en lugar de darle una función de densidad de probabilidad o función de densidad acumulada y esperar que usted obtenga el número usted mismo (que parece ser el enfoque de Apache Commons-Math):

RandomEngine engine = new DRand(); 
Poisson poisson = new Poisson(lambda, engine); 
int poissonObs = poisson.nextInt(); 

Normal normal = new Normal(mean, variance, engine); 
double normalObs = normal.nextDouble(); 

Además, tenga en cuenta que la distribución de Poisson P (& lambda;) para large & lambda; se puede aproximar muy bien por la distribución normal N (& lambda ;, sqrt (& lambda;)).

+0

¿Hay alguna manera de especificar el valor mínimo y máximo que usan? No lo parece, por lo que vi. –

+0

Eso es porque las distribuciones de Poisson y Normal no tienen un máximo o mínimo (bueno, Poisson tiene un mínimo fijo de 0). –

+0

biblioteca muy agradable, gracias! – peq

6

El estándar Java RNG (java.util.Random) y sus subclases, como java.security.SecureRandom, ya generan valores uniformemente distribuidos.

También tienen un método, nextGaussian, que devuelve valores distribuidos normalmente. Por defecto, la distribución tiene una media de cero y una desviación estándar de 1, pero esto se trivializa. Simplemente multiplique por el requerido s.d. y agrega la media requerida. Así, por ejemplo, si desea valores distribuidos normalmente con una media de 6 y desviación estándar de 2.5, que te hacer esto:

double value = rng.nextGaussian() * 2.5 + 6; 

La distribución de Poisson no se admite explícitamente, pero que se puede fingir por haciendo lo mismo que Tom's Python code.

Alternativamente, puede estar interesado en mi Uncommons Maths library, que proporciona clases de utilidad para Normal, Poisson y otras distribuciones.

+0

El enlace a Uncommons es 404. –

Cuestiones relacionadas