positivos - Generador de números aleatorios que genera enteros para Java
numeros aleatorios en java netbeans (4)
Quiero generar algunos enteros aleatorios en Java, pero esto de acuerdo con algunas leyes de distribución. Mas especifico:
Quiero generar algunos enteros aleatorios para la distribución gaussiana. 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 puedes 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!
Le sugiero que use la biblioteca Uncommons Maths , que comprende diferentes generadores aleatorios (por ejemplo, Mersenne Twister, basado en AES) y distribuciones (poisson, gaussian, etc.)
En cuanto al "problema doble": casi todos los generadores aleatorios generan el doble porque son los más utilizados. Si necesita números enteros, tendrá que hacer el redondeo usted mismo (una llamada a Math.round será suficiente). 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.
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 qué recibí una votación? 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.
Simplemente genere un doble y escalarlo al rango entero que necesita. 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.
boost tiene algunos generadores de números aleatorios realmente 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