Números aleatorios en Java: del caos al orden
\n\n¡Hola, futuro javista! Si alguna vez has escrito juegos, simulaciones, pruebas o simplemente has querido agregar un elemento de sorpresa a tu programa, seguramente te has enfrentado a la necesidad de obtener un número entero aleatorio en un rango determinado. Parecería que no podría ser más sencillo. Pero en la práctica, los principiantes a menudo se preguntan: «¿Por qué obtengo números del 0 al 100 y no del 50 al 100?» o «¿Por qué mi código da error?».
\n\nHoy analizaremos este tema de una vez por todas. Aprenderás cómo generar un número aleatorio en Java en cualquier rango, utilizando tres enfoques principales. Spoiler: uno de ellos es la mejor opción para el 90% de los casos. ¡Allá vamos!
\n\n¿Por qué es importante?
\nLa generación de números aleatorios es una tarea básica pero críticamente importante. No se puede prescindir de ella al:
\n- \n
- Crear datos de prueba (por ejemplo, IDs de usuarios). \n
- Implementar mecánicas de juego (obtención de objetos, generación de niveles). \n
- Modelar procesos aleatorios (colas, tráfico). \n
- Seleccionar un elemento aleatorio de una lista. \n
Al dominar este tema, dejarás de temer la «magia» en el código y podrás manejar la aleatoriedad con confianza.
\n\nMétodo n.º 1: El clásico — java.util.Random
\nEste es el abuelo de todos los generadores en Java. La clase java.util.Random existe desde las primeras versiones y todavía se usa activamente. Su principal ventaja es la versatilidad.
¿Cómo obtener un int aleatorio de 0 a N?
\nEl método nextInt(int bound) devuelve un número aleatorio desde 0 (incluido) hasta bound (excluido). Es decir, si escribes nextInt(10), obtendrás un número del 0 al 9.
import java.util.Random;\n\npublic class RandomExample {\n public static void main(String[] args) {\n Random random = new Random();\n int number = random.nextInt(10); // 0..9\n System.out.println("Número aleatorio: " + number);\n }\n}\n\n¿Y cómo hacerlo de 5 a 15?
\nAquí está el secreto principal. Para obtener un número en un rango arbitrario [min, max], debes usar la fórmula:
min + random.nextInt(max - min + 1)
Analicemos con un ejemplo: rango de 5 a 15.
\n- \n
max - min + 1= 15 - 5 + 1 = 11. EntoncesnextInt(11)dará números del 0 al 10. \n - Sumamos
min(5): obtenemos el rango 5..15. \n
Verificamos: si nextInt(11) devolvió 0, entonces 0+5 = 5. Si devolvió 10, entonces 10+5 = 15. ¡Perfecto!
Random random = new Random();\nint min = 5;\nint max = 15;\nint randomNumber = min + random.nextInt(max - min + 1);\nSystem.out.println("Número aleatorio de 5 a 15: " + randomNumber);\n\nImportante: ¡No olvides el +1! Sin él, el valor máximo será 1 menos.
Método n.º 2: Enfoque moderno — ThreadLocalRandom
\nA partir de Java 7, apareció la clase ThreadLocalRandom. Está especialmente diseñada para aplicaciones multiproceso (pero funciona muy bien también en aplicaciones de un solo hilo). La principal ventaja es que es más rápida que Random y no requiere crear un objeto separado.
Uso en código de un solo hilo
\nTiene un método conveniente nextInt(int origin, int bound) que acepta directamente los límites del rango. Ten en cuenta: origin está incluido, bound está excluido. Si necesitas incluir también el límite superior, simplemente agrega +1.
import java.util.concurrent.ThreadLocalRandom;\n\npublic class ThreadLocalRandomExample {\n public static void main(String[] args) {\n // Número de 5 a 15 (incluido)\n int randomNumber = ThreadLocalRandom.current().nextInt(5, 16);\n System.out.println("Número aleatorio: " + randomNumber);\n }\n}\n\n¿Ves qué sencillo? Sin fórmulas,