2010-10-10 24 views
5

Quiero generar algunos enteros aleatorios en Java, pero esto de acuerdo con algunas leyes de distribución. más específica:Generador de números aleatorios que genera enteros para Java

  • Quiero generar algunos números enteros aleatorios para la distribución de Gauss. Descubrí solo generadores que arrojan resultados dobles para la distribución gaussiana. ¿Porqué es eso?

  • Quiero generar algunos enteros aleatorios entre algunos límites para la distribución exponencial? Aquí también descubrí solo sobre generadores que vuelven doble. Tampoco descubrí una forma de generar algunos números exponenciales aleatorios solo entre dos límites.

¿Me puede ayudar? ¿Conoces una biblioteca que puede hacer lo que yo quiero? Estudié la biblioteca, el potro y las matemáticas comunes de Michael Flanagan, pero no tienen lo que necesito.

Gracias!

Respuesta

-1

Solo genera un doble y escala al rango entero que necesites. Por ejemplo, si un generador de números aleatorios regular (uniforme) genera números de 0.0 a 1.0 y quiere números de 0 a 100, usted simplemente multiplicaría el número aleatorio generado por 100.

+2

pero seguirá distribuyéndose uniformemente en lugar de gaussiano. –

+0

sí, el generador doble se distribuyó uniformemente, si tuviera una distribución gaussiana, el rango entero también tendría una distribución gaussiana. – flownt

+0

¿Por qué el voto a favor? El OP dijo que tenían un generador de números aleatorios Gaussiano. Estaba señalando que el número se puede traducir de una distribución gaussiana a otra. No recuerdo las matemáticas, pero es una transformación simple. – dty

2

Si tiene un número doble de 0 a 1 puede escalarlo al número entero:

int res = lowLimit + (int) (myRandFunction() * (highLimit - lowLimit));

Editar:

por eso que tengo un voto abajo? Está triste de que tenga una función que devuelve un doble de distribución que él quiere (supuse una forma doble de 0 a 1), así que esto va a hacer el trabajo.

+0

¿Cómo se distribuye gaussiana o exponencialmente? NOTA: No soy el infractor. –

+0

if myRandFunction() devuelve números en la distribución gaussiana de 0 a 1, esto devolverá enteros gaussianos distribuidos. – Klark

+0

(tampoco downvote) No hay números enteros gaussianos distribuidos. La distribución gaussiana (normal) es válida solo en el contexto de rangos continuos. La distribución discreta más similar es binomial. – Rekin

-1

boost tiene algunos generadores de números aleatorios muy buenos, sé que es C++ y no Java, pero las implementaciones deberían ser una buena guía para implementarlas tú mismo.

http://www.boost.org/doc/libs/1_43_0/doc/html/boost_random.html

+0

¿por qué todas las respuestas son downvoted? – flownt

+1

No lo hice, pero lo creo porque ninguno de ellos realmente responde la pregunta. –

+0

@Colin Hebert, no es difícil hacerlo usted mismo aproximadamente gaussian: rand()/4 + rand()/4 + rand()/4 + rand()/4 ya que la distribución binomial se aproxima a la distribución normal, esto debería generar una distribución binomial entre 0 y la salida máxima de rand() – flownt

3

que sugerimos para utilizar la biblioteca Uncommons Maths, que comprende diferentes generadores aleatorios (por ejemplo Mersenne Twister, basada en AES) y las distribuciones (Poisson, gaussianos y así sucesivamente)

En cuanto a la " doble problema ": casi todos los generadores aleatorios generan el doble porque son los más utilizados. Si necesita números enteros, deberá hacer el redondeo usted mismo (bastará con una llamada al Math.round). Digamos que está generando alturas de personas aleatorias con precisión de centímetro: si su generador aleatorio devuelve 175.234, puede simplemente redondearlo a 175. Eso realmente no es un problema.

En cuanto a los límites para la distribución exponencial: no hay generadores que le permitan elegir límites porque no existen tales límites para la distribución exponencial. Una distribución exponencial típicamente modela los retrasos entre dos eventos consecutivos en un proceso de Poisson: la demora puede ser tan baja como 0 o puede ser extremadamente alta. Los resultados extremadamente altos son muy poco probables, pero no son imposibles. puede resolver el problema obteniendo un número aleatorio del generador, agregando su límite inferior y usando Math.max para recortarlo si es más alto que su límite superior. Pero esto ya no es una distribución exponencial.

Cuestiones relacionadas