¿Quieres que tu juego de piedra, papel o tijera elija una jugada distinta cada vez? Para lograrlo necesitas generar números aleatorios en JavaScript dentro de un rango específico, y eso se consigue combinando dos funciones nativas: Math.random y Math.floor. Aquí te muestro cómo encajan, por qué funcionan y cómo encapsularlas en una función reutilizable.
¿Cómo funciona Math.random en JavaScript?
Las computadoras no generan números aleatorios dentro de un rango por sí solas. Lo que hacen es producir un decimal entre 0 y 1, algo así como 0.19, 0.58 o 0.88. Piénsalo como un porcentaje: si multiplicas 20 por 0.5, obtienes 10, porque equivale al 50%.
La función Math.random() vive dentro del objeto Math y se invoca sin parámetros. Cada vez que la llamas, devuelve un decimal nuevo que nunca es exactamente 0 ni exactamente 1 [02:30].
¿Qué devuelve Math.random? Un número decimal entre 0 y 1, sin incluir el 1. Cada invocación produce un valor distinto, lo que la convierte en la base para cualquier lógica aleatoria en JavaScript.
¿Para qué sirve Math.floor?
Math.floor es la función que elimina los decimales de cualquier número. Si le pasas 3.141592, te devuelve 3. Si le pasas 4.9, te devuelve 4. No redondea hacia el más cercano, siempre baja al entero inferior [01:40].
Esa M mayúscula en Math indica que es un objeto especial, una clase, y el punto te permite acceder a las funciones que viven dentro: Math.floor, Math.random, y muchas más.
¿Cómo generar un número aleatorio entre dos valores en JavaScript?
La fórmula combina ambas funciones con un poco de aritmética. Necesitas un valor mínimo y un valor máximo, y la expresión queda así:
javascript
Math.floor(Math.random() * (max - min + 1)) + min
El orden de ejecución importa. Primero se calcula el paréntesis interno, luego se multiplica por el resultado de Math.random(), después se suma el mínimo y al final Math.floor corta los decimales.
Veamos un ejemplo con min = 1 y max = 3:
max - min + 1 da 3.
- Si
Math.random() devuelve 0.1, multiplicado por 3 da 0.3. Sumas 1 y obtienes 1.3. Floor lo deja en 1.
- Si devuelve 0.5, da 1.5. Sumas 1 y obtienes 2.5. Floor lo deja en 2.
- Si devuelve 0.9, da 2.7. Sumas 1 y obtienes 3.7. Floor lo deja en 3.
El resultado siempre cae entre 1 y 3, que es justo lo que necesitas para piedra, papel o tijera [05:10].
¿Por qué se suma 1 dentro del paréntesis? Porque Math.random arranca en 0 y nunca llega a 1. Sin ese +1, jamás obtendrías el valor máximo del rango.
¿Cómo se prueba el algoritmo en la consola?
Abre el inspector de elementos del navegador y entra a la pestaña Console. Ahí puedes ejecutar el algoritmo con cualquier rango. Si pruebas con min = 15 y max = 19, al ejecutarlo varias veces obtendrás valores como 17, 15, 18, 19, 16, todos dentro del rango. Si lo cambias a min = 5 y max = 12, los resultados serán 6, 8, 7, 11, 10, 12, sin salirse del intervalo [07:20].
¿Cómo convertir el algoritmo en una función reutilizable?
Repetir la fórmula completa cada vez que la necesitas es ineficiente. La solución es encapsularla en una función, una pieza de código que recibe parámetros y devuelve un resultado.
javascript
function aleatorio(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
La palabra clave function declara la función, aleatorio es su nombre, y min y max son los parámetros que recibe. La instrucción return indica qué valor devuelve cuando la invocas.
Para usarla, basta con llamarla así:
javascript
const pc = aleatorio(1, 3);
La diferencia entre declaración e invocación es clave: declarar es definir qué hace la función, invocar es ejecutarla pasándole los argumentos concretos. Lo que vive dentro de las llaves solo se ejecuta cuando invocas la función [10:15].
¿Qué ventajas tiene usar una función?
- Reutilizas la lógica las veces que quieras sin reescribirla.
- Cambias el rango con solo modificar los argumentos:
aleatorio(1, 100), aleatorio(50, 80).
- El código queda más limpio y fácil de leer.
- Aíslas la complejidad matemática en un solo lugar.
En el juego de piedra, papel o tijera, esta función reemplaza el valor fijo del PC y hace que cada partida sea impredecible. A veces ganas, a veces empatas, a veces pierdes, y todo depende del decimal que Math.random devuelva en ese momento.
¿Te animas a comprimir este código en menos de la mitad de líneas usando una lógica más simple? Comparte tu versión en los comentarios y cuéntame qué enfoque tomaste.