Generación de números enteros aleatorios en JavaScript: rango preciso en 2025

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Números aleatorios en JavaScript: del caos al orden

\n

Imagine: está escribiendo un juego donde necesita seleccionar aleatoriamente un cofre del tesoro del 1 al 100. O quizás está creando una prueba A/B que elige una variante aleatoria para el usuario. Parecería que podría ser más simple? Pero el diablo, como siempre, está en los detalles. La cuestión de generar números enteros aleatorios en JavaScript en un rango específico es una de las más populares en Stack Overflow, y no sin razón. Incluso los desarrolladores experimentados a veces tropiezan con los escollos de Math.random().

\n

En este artículo, analizaremos no solo los métodos clásicos, sino también las mejores prácticas de 2025: cómo hacer que el código no solo funcione, sino que también sea seguro, predecible (en el buen sentido) y eficiente. ¡Allá vamos!

\n\n

El clásico del género: Math.random() y sus escollos

\n

Empecemos por lo fundamental. La función incorporada Math.random() devuelve un número pseudoaleatorio de punto flotante en el rango [0, 1). Punto clave: 0 está incluido, pero 1 no. Esta es una distribución "injusta" si desea obtener números enteros.

\n

Aquí está la forma más común (y la más incorrecta) que a menudo se encuentra en libros de texto antiguos:

\n
// MAL ejemplo: sesgo de probabilidad\nfunction getRandomBad(min, max) {\n  return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n
\n

A primera vista, todo parece correcto. Pero profundicemos. Math.floor() redondea hacia abajo. Si Math.random() genera un número muy cercano a 1 (pero no igual), la multiplicación por (max - min + 1) dará un valor menor que max + 1, y Math.floor() lo truncará. Sin embargo, debido a la precisión limitada de los números de punto flotante (IEEE 754), algunos valores aparecen con menos frecuencia que otros. Para un rango de 0-1 esto es imperceptible, pero para rangos grandes (por ejemplo, del 1 al 1,000,000), el sesgo se vuelve estadísticamente significativo.

\n

Conclusión: esta fórmula funciona para rangos pequeños, pero no es "criptográficamente pura" y puede causar un sesgo en la distribución.

\n\n

La fórmula correcta de MDN

\n

Mozilla Developer Network (MDN) recomienda un enfoque más correcto que minimiza los errores de redondeo:

\n
// Buena forma, universal\nfunction getRandomIntInclusive(min, max) {\n  const minCeiled = Math.ceil(min);\n  const maxFloored = Math.floor(max);\n  return Math.floor(Math.random() * (maxFloored - minCeiled + 1) + minCeiled);\n}\n
\n

La diferencia es que convertimos explícitamente los límites a números enteros usando Math.ceil() y Math.floor(). Esto garantiza que min y max se procesen correctamente, incluso si accidentalmente pasa un número fraccionario. Utilice este método como estándar básico en 2025.

\n\n

Alternativas: cuando Math.random() no es suficiente

\n

El clásico Math.random() es un generador pseudoaleatorio (PRNG). Es determinista: si conoce la semilla inicial (seed), puede predecir toda la secuencia. Para la mayoría de las aplicaciones web (animaciones, contenido aleatorio) esto es suficiente. Pero hay escenarios donde se necesita aleatoriedad real:

\n
    \n
  • Seguridad: generación de tokens, contraseñas, tokens CSRF.
  • \n
  • Criptografía: cifrado de datos en el cliente.
  • \n
  • Juegos de azar: distribución justa de ganancias.
  • \n
\n

En estos casos, crypto.getRandomValues() viene al rescate: un generador criptográficamente seguro (CSPRNG). Utiliza fuentes de entropía del sistema y es mucho menos predecible.

\n\n

Generación de números enteros con crypto.getRandomValues()

\n

Así es como se ve una implementación moderna para 2025:

\n
// Generación segura de un número entero aleatorio en el rango [min, max]\nfunction getSecureRandomInt(min, max) {\n  const range = max - min + 1;\n  // Valor máximo múltiplo de range (para evitar sesgo                

Blogs

Book Recommendations