Generación de números aleatorios con probabilidad ponderada en Java

0
14

Ha pasado un tiempo desde mi última publicación de programación Java. Recientemente me he centrado en los tutoriales de Python y Machine Learning, pero Java sigue siendo mi lenguaje de programación favorito.

La selección de números aleatorios con probabilidades ponderadas es una tarea común en programación, especialmente cuando se trabaja con datos que tienen una distribución de probabilidad específica. Por ejemplo, puede tener una lista de letras con diferentes probabilidades de ser seleccionadas o una lista de elementos con diferentes probabilidades de ser elegidos de un menú.

En esta publicación, exploraremos cómo implementar una solución para este problema en Java utilizando un enfoque simple e intuitivo.

Generación de números aleatorios

Un número aleatorio es un número generado por un programa de computadora o un generador de números aleatorios de hardware de una manera que es impredecible y no sigue un patrón determinista. El propósito de generar números aleatorios es proporcionar un medio para introducir un elemento de azar en un programa o sistema de computadora.

Hay muchas formas diferentes de generar números aleatorios, y la calidad y las características de los números aleatorios generados pueden variar significativamente según el método utilizado. Sin embargo, en general, un buen generador de números aleatorios debe producir números que se distribuyan uniformemente en un amplio rango, sean estadísticamente independientes entre sí y no sean fácilmente predecibles.

Para generar un número aleatorio en Java, puede usar la clase java.util.Random. Por ejemplo, el siguiente código genera un número aleatorio entre dos números:

Este código genera un número entero aleatorio entre 0 y 10, inclusive. Cada número tiene la misma probabilidad de ser elegido. Para probar este algoritmo, vamos a crear una prueba de concepto.

Generación de números aleatorios con igual probabilidad

Para probar el código anterior, voy a crear un script de prueba. El código que voy a presentar aquí se puede encontrar en nuestro repositorio de Github.

Lo primero que voy a hacer es declarar una clase con los siguientes atributos:

Esta clase permite crear objetos con letras, un contador y una probabilidad específica. Ahora voy a crear una lista de 10 letras:

Para seleccionar aleatoriamente una letra, creé este método:

l método realiza un bucle que se repetirá determinada cantidad de veces. En cada iteración del bucle se genera un número entero aleatorio entre 0 y el tamaño de la lista de «letras». Luego, selecciona el objeto «Letra» en el índice del número aleatorio e incrementa su cuenta en 1.

Una vez que el bucle termina de ejecutarse, el método imprime el recuento y el porcentaje de cada objeto «Letra». Finalmente, restablece el recuento de cada objeto «Letra» a 0.

Para probar este código, necesitas hacer algo como esto:

El siguiente resultado se produce después de ejecutar la selección de letras aleatorias 100,000 veces:

probabilidad ponderada en java

Como podemos ver, cada letra ha sido seleccionada aproximadamente un 10% de las veces, fluctuando los resultados ligeramente por encima o por debajo de este valor. Esto demuestra que el proceso de selección de letras al azar está generando una salida con la misma probabilidad para cada letra.

Generación de números aleatorios con probabilidad ponderada en Java

A veces podemos querer generar números aleatorios con probabilidades desiguales. Por ejemplo, podemos querer que una letra se seleccione con más frecuencia que las demás. En estos casos, podemos utilizar probabilidades ponderadas. Esto nos permite especificar la probabilidad de seleccionar un elemento en particular, en lugar de que todos los elementos tengan la misma probabilidad de ser seleccionados.

En la lista de letras que creé antes asigné una probabilidad para cada letra:

Ahora crearemos un método similar al anterior, pero los porcentajes resultantes para cada letra deben estar cerca de las probabilidades que se establecieron. Aquí está el método:

El resultado de ejecutar este código es:

probabilidad ponderada en java

Como podemos ver en el resultado, la frecuencia de selección de cada letra se alinea con la probabilidad que se estableció previamente. Esto demuestra que nuestro algoritmo funciona efectivamente como un generador de números aleatorios ponderados.

Conclusion

El código completo con ambos ejemplos se puede descargar desde nuestro repositorio de Github.

En conclusión, hemos aprendido a generar números aleatorios con igual probabilidad y con probabilidad ponderada en Java usando la clase java.util.Random. También hemos visto cómo implementar un algoritmo de selección aleatoria con probabilidades ponderadas utilizando una lista de objetos con una letra, un contador y un atributo de probabilidad.

Esperamos que esta publicación le haya sido útil y si tiene alguna pregunta o comentario, no dude en dejarlo a continuación. ¡Gracias por leer!

5 1 vote
Article Rating
Suscríbete
Notify of
guest

0 Comments
Inline Feedbacks
View all comments