Generación de números aleatorios Javascript

  • Por
  • 26 de abril de 2002
  • Valoración:
  • 20 Comentarios
  • Scripts en Javascript
Taller en el que se crea una función para generar números aleatorios en lenguaje Javascript.
En Javascript disponemos de la clase Math, muy útil cuando queremos hacer cálculos matemáticos de cierta complejidad. Dicha clase está explicada y documentada en un capítulo del manual de Javascript II. Para el que lo necesite, también tenemos explicaciones de lo que son las clases y los objetos.

En este taller de Javascript vamos a construir una simple función para crear un número aleatorio, entre un mínimo y un máximo, que podremos utilizar luego en otros scripts más complejos.

Aquí tenemos el código que hace uso del método random de la clase Math para obtener un número aleatorio con Javascript.

var aleatorio = Math.random()

Así hemos creado una variable aleatorio a la que asignamos el resultado de ejecutar el método random de la clase Math. El número aleatorio que obtenemos siempre estará comprendido entre 0 y 1.

Si deseamos obtener un número aleatorio en otro rango lo podemos conseguir con un poco de matemáticas y la clase Math. Para ilustrarlo vamos a hacer una función que devuelve un número aleatorio comprendido en un intervalo. El intervalo lo recibe como parámetro con dos variables, una para el límite por la parte inferior y otra para la el límite por la parte superior.

function aleatorio(inferior,superior){
    numPosibilidades = superior - inferior
    aleat = Math.random() * numPosibilidades
    aleat = Math.round(aleat)
    return parseInt(inferior) + aleat
}

La función que hemos hecho es muy sencilla, pero funciona perfectamente para todos los tipos de intervalos que podamos pasarle, tanto con números positivos como negativos. Lo primero que hacemos es obtener el número de posibilidades restando al límite superior el inferior. Luego multiplicamos dicho numero de posibilidades por el número aleatorio obtenido (que está entre 0 y 1), con lo que obtenemos un número aleatorio entre 0 y el número de posibilidades.

Nota: Esta función tiene un pequeño problema, pues los números aleatorios que devuelve no tienen las mismas posibilidades de salir. Para solucionarlo, un visitante ha incluido un comentario en el artículo que se aconseja leer.

El número tiene un montón de decimales, y en este ejemplo deseamos obtener un número entero, sin decimales. Por eso luego utilizamos el método round() de la clase Math, que nos da el entero más próximo. Como el número todavía está entre 0 y el número de posibilidades tenemos que sumarle el límite inferior, con lo que estará dentro del rango que deseamos. Este último valor será en que devuelva la función.

Esta función se puede ver en marcha en una página a parte. En el ejemplo hemos construido un pequeño formulario que podemos rellenar con el míninmo y el máximo y cuando apretemos sobre el botón se mostrará el valor aleatorio en el campo de abajo del todo.

Un ejemplo de lo que podemos hacer con un número aleatorio puede ser crear un enlace aleatorio en una página web. Lo podemos ver en el ejemplo Enlace aleatorio en Javascript. Además, en este ejemplo se crea el número aleatorio de manera ligeramente distinta a como lo hemos visto ahora, lo que puede ser interesante para aprender mejor a usar los métodos de la clase Math.

Nota: Insisto, leeros los comentarios que acompañan a este artículo (un poco más abajo de estas líneas) ya que ofrecen scripts mejorados para crear números aleatorios. Además, hay algún comentario con un script para asegurarse que las posibilidades de aparición de cada valor aleatorio sean las mismas.

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Comentarios

Gustavo Doldán

15/12/2003
En el artículo: "Generación de números aleatorios Javascript", le detecté un error a la función:

function aleatorio(inferior,superior){
    numPosibilidades = superior - inferior
    aleat = Math.random() * numPosibilidades
    aleat = Math.round(aleat)
    return parseInt(inferior) + aleat
}

Lo correcto seria:

function aleatorio(inferior,superior){
    numPosibilidades = superior - inferior
    aleat = Math.random() * numPosibilidades
    aleat = Math.floor(aleat)
    return parseInt(inferior) + aleat
}

Ya que al usar el round generamos numeros entre inferior y superior + 1, teniendo los dos extremos la mitad de probabilidad que los otros numeros del intervalo.

Por ejemplo aleatorio(0,4) devuelve numeros entre 0 y 5

con las siguientes probablidades:

0:0,1
1:0,2
2:0,2
3:0,2
4:0,2
5:0,1

Bueno disculpa la molestia, pero era por si queres corregirlo.
En realidad me dí cuenta: no por suspicaz, sino porque al aplicarla los valores extremos salían menos seguido: pero bueno muchos descubrimentos fueron empíricos!! jaja

Randou

01/8/2005
mis mas sinceras gracias al que escribio el articulo y el ejemplo de numeros aleatorios, me fue muy util, con respecto al Comentario de Gustavo Doldán quisiera hacer notar algo, por alguna razon al cambiar del Comoando ROUND al comando FlOOR el numero maximo no se da entre las opciones de los numero aleatorios, es decir si se coloca como minimo el 1 y el 6 como maximo solo salen los numeros del 1 al 5
otra cosa no se por que poero solo funciona en ciertas computadoras, si alguien me puede explicar por que se da esto se lo agradeceria

Gerardo Angeles Nava

10/10/2005
Yo hice unas modificaciones, pero envio el código en Java, que es en lo que necesitaba la función y la implemente:

for(int i = 1; i <= 5; i++){
    int inferior = 5;
    int superior = 8;
    int numPosibilidades = (superior + 1) - inferior;
    double aleat = Math.random() * numPosibilidades;
    aleat = Math.floor(aleat);
    aleat = (inferior + aleat);
    System.out.println("Entre " + inferior + " y " + superior + " aleatorio " + i + " : " + aleat);
    if((aleat < inferior) || (aleat > superior)) System.out.println("Rango erroneo");
}

Gerardo Angeles Nava

10/10/2005
Ok, envie un comentario pero escrito en lenguaje en Java, ya hice los ajustes para JavaScript y contempla generar un número aleatorio del rango 0 al limite superior y también del rango limite Inferior al limite superior, espero sirva, gracias.

for(var i = 1; i <= 5; i++){
    var iSuperior = 8;
    var dResult = Math.random();
    dResult = Math.floor(dResult * (iSuperior + 1));
    document.writeln("Entre 0 y " + iSuperior + " aleatorio " + i + " : " + dResult);
    document.writeln("<br>");
    if(dResult > iSuperior) document.writeln("Rango erroneo");
    }

for(var i = 1; i <= 5; i++){
    var inferior = 5;
    var superior = 8;
    var numPosibilidades = (superior + 1) - inferior;
    var aleat = Math.random() * numPosibilidades;
    aleat = Math.floor(aleat);
    aleat = (inferior + aleat);
    document.writeln("Entre " + inferior + " y " + superior + " aleatorio " + i + " : " + aleat);
    document.writeln("<br>");
    if((aleat < inferior) || (aleat > superior)) System.out.println("Rango erroneo");
}

Ricardo

08/2/2006
He hecho unas modificaciones al script para saber si los números aleatorios salen más o menos con las mismas probabilidades.

Simplemente realizo una muestra de 1000 números aleatorios y acumulo cuantas veces aparece cada uno de ellos. Luego muestro las veces que han aparecido y las apariciones deberían ser bastante próximas para los distintos valores posibles.

Parece que todo funciona bien y que los números aleatorios salen perfectamente. Este es el script que he creado:

<script>
//creo un array
contador_apariciones=new Array()
contador_apariciones[5]=0
contador_apariciones[6]=0
contador_apariciones[7]=0
contador_apariciones[8]=0

for(var i = 1; i <= 1000; i++){
var inferior = 5;
var superior = 8;
var numPosibilidades = (superior + 1) - inferior;
var aleat = Math.random() * numPosibilidades;
aleat = Math.floor(aleat);
aleat = (inferior + aleat);

contador_apariciones[aleat]++

document.writeln("Entre " + inferior + " y " + superior + " aleatorio " + i + " : " + aleat);
document.writeln("<br>");
if((aleat < inferior) || (aleat > superior)) System.out.println("Rango erroneo");
}

document.writeln ("<p>")
document.writeln ("<br>Contador de apariciones del 5: " + contador_apariciones[5])
document.writeln ("<br>Contador de apariciones del 6: " + contador_apariciones[6])
document.writeln ("<br>Contador de apariciones del 7: " + contador_apariciones[7])
document.writeln ("<br>Contador de apariciones del 8: " + contador_apariciones[8])
</script>

tk

25/5/2007
buen dia con todos
yo se que es puede ser el lugar no indicado, pero me atrevo a pedirles si alguien podria darme la misma codificacion de numero aleatorio pero esta vez para visual basic.net.
seria de mucha ayuda para mi si podeis hacerlo.
de no ser posible gracias de todas maneras.
tk

Q - K - to

30/5/2007
// 5 numeros aleatorios entre inferio y superior

numeros = new Array();
inferior = 3;
superior = 15;
iteraciones = 0;

while (iteraciones < 5) {
temporal = Math.round(Math.random() * superior);
if ((temporal >= inferior) && (temporal <= superior)) {
document.write(temporal + "<br>");
iteraciones ++;
}
}

Yoa

16/12/2008
Yo tengo una forma mas facil, es la siguiete:
var aleatorio = (Math.round(Math.random()*40))+20;
donde 20 es el limite inferior y y 40 es la diferencia entre el limite superior y el limite inferiro.. o sea el limite superior seri 60.
En fin esta funcion te da u numero aleatorio entre 20 y 60.

carlos

24/6/2009
repeticiones en numeros aleatorios
si me pidiesen generar n numeros aleatorios, pero kuando dos numeros konsecutivos se repitan, se detenga y ya no genere mas numeros, luego k me indique kuantos numeros hay en total para k se repitan dos numeros consecutivos

Luis

02/10/2009
Aclaracion
Buenas en el ejemplo de Math.random no me quedo claro que hay que poner donde dice: funtion aleatorio;ya que cuando lo pongo en el netbeans me señala q esta malo, aqui les envio lo que he realizado
int inferior=0;
int superior=20;
//////////////////////////////////////////////
function aleatorio(inferior,superior){
100 = superior - inferior
aleat = Math.random(cod_tec) *100
aleat = Math.floor(aleat)
return parseInt(inferior) + aleat
}

Jorge

29/12/2009
Numeros Aleatorios
Aqui os dejo mis algoritmos:

Devuelve un numero aleatorio entre 2 rangos, trabaja tambien con rangos negativos

function RangeRandom(NumMin,NumMax)
{
var NumP = NumMax - NumMin;
if(NumP < 0)
NumP = NumP * (-1);
NumP++;

return Math.round(((Math.random() - ((1 / NumP) / 2 )) / (1 / NumP)) + NumMin);
}

-----------------------------------------------------------------------------------------------

El siguiente algoritmo es igual q el anterior pero solo esta diseñado para rangos positivos:

function RangeRandom(NumMin,NumMax)
{
return Math.round(((Math.random() - ((1 / (NumMax - NumMin + 1)) / 2 )) / (1 / (NumMax - NumMin + 1))) + NumMin);
}

----------------------------------------------------------------------------------------------

El ultimo algoritmo lo he planteado como esta en C++;

Es decir, introduces el numero de posibilidades y el te devuelve el numero aleatorio comprendido empezando desde cero. EJ.; 10, te devolvera un numero entre el 0 y el 9. De esta manera los calculos siempre se hacen con los numeros mas pequeños ayudando a su optimizacion.

function RangeRandom(NumP)
{
return Math.round((Math.random() - ((1 / NumP) / 2 )) / (1 / NumP));
}

Jorge

29/12/2009
Numeros Aleatorios
Por cierto, los 3 algoritmos q os deje nos devuelve cada numero el mismo numeros de veces, no salen unos mas q otros, vamos q son totalmente precisas en cuanto aletoriedad se refiere.

Son las q uso para hacer calculos simulados de millones de apuestas de juegos de casinos por lo tanto la precision es muy muy muy importante para estos planteamienos

Javier

02/12/2011
Math.floor vs Math.round
El comentario de Gustavo tiene razón. Pero me gustaría aclararlo:
Math.random nos da un número aleatorio entre 0 y 0.9999999999999999
Si lo multiplicamos por ejemplo por 4, obtendremos números decimales entre 0 y 3.999999999
Al quitar los decimales (Math.floor) obtenemos 4 posibilidades: 0, 1, 2 y 3
El 0 cuando salgan números del 0 al 0.999999
el 1 cuando salgan números del 1 al 1.999999
el 2 cuando salgan números del 2 al 2.999999
el 3 cuando salgan números del 3 al 3.999999

Como veis hay las mismas posibilidades para cada uno

Pero si redondeamos (Math.round) obtenemos 5 posibilidades 0,1,2,3 y 4
El 0 cuando salgan números del 0 al 0.499999
el 1 cuando salgan números del 0.5 al 1.499999
el 2 cuando salgan números del 1.5 al 2.499999
el 3 cuando salgan números del 2.5 al 3.499999
el 4 cuando salgan números del 3.5 al 3.999999

Obviamente el 0 y el 5 tienen la mitad de probabilidades que los demás
Así que me quedo con:
aleat=Math.floor(Math.random() * x)+y;
que me da x posibilidades a partir de y
Un saludo

Ahora tenemos una

Jon

30/12/2011
Necesito imprimir en un div cada resultado
He variado un poco el script y lo he hecho asi, no encuentro los fallos que tenga;

<script>
//creo un array
contador_apariciones=new Array()
contador_apariciones[1]=0
contador_apariciones[2]=0
contador_apariciones[3]=0
contador_apariciones[4]=0
contador_apariciones[5]=0
contador_apariciones[6]=0
contador_apariciones[7]=0
contador_apariciones[8]=0
contador_apariciones[9]=0
contador_apariciones[10]=0
contador_apariciones[11]=0
contador_apariciones[12]=0
contador_apariciones[13]=0

for(var i = 1; i <= 13; i++){
var inferior = 1;
var superior = 13;
var numPosibilidades = (superior + 1) - inferior;
var aleat = Math.random() * numPosibilidades;
aleat = Math.floor(aleat);
aleat = (inferior + aleat);

contador_apariciones[aleat]++;
var resultados = contador_apariciones[aleat]++;
alert (resultado);
}

var Tabla=document.getElementById("resultados");
Tabla.innerHTML="";
for (posicion=1;posicion=>resultados.length;posicion++){
//Menu.innerHTML+=listadoURL[posicion]+listadoEnlaces[posicion]+"<br />";

var nuevoResultado = document.Tabla.createElement("tr");
nuevoResultado.value=resultados[posicion];
nuevoResultado.innerHTML=listadoEnlaces[posicion];

Insercion=Tabla.appendChild(nuevoResultado);
Tabla.innerHTML+="<tr>"+ Insercion + "</tr>";

}

</script>

Marina

19/5/2012
Uso de los códigos
Quisiera hacerles una pregunta, es posible usar esos códigos para que la gente descargue un archiv0 mp3 desde mi pagina web, muchísimas gracias por su colaboración con este tema

chelo

26/5/2012
suma y resta con random
Hola,quisiera saber como hago para utlizar la funcion random para devolver numeros aleatorios para sumar y restar,y si le puedo asugnar el numero de cifras que deseo utlizar en mi operacion,por ejemplo,sumar dos numero de dos digitos,o restar dos numeros de cuatro digitos,gracias,saludos.

Matuss

30/5/2012
como sumar 2 numeros aleatorios en JavaScript??
necesito 2 columnas que se sumen con numeros aleatorios..

Ejemplo: 5 + 10 = 15 (El 5 y el 10 tienen q ser aleatorios)
Y si me verifica si ingrese el numero correcto

Muchas gracias

EdwinMarin

14/10/2013
Edwin (de forma resumida)
function aleatorio(inferior,superior){
var resAleatorio = Math.floor((Math.random() * (superior - inferior + 1)) + inferior);
return resAleatorio;
}

EdwinMarin

14/10/2013
Edwin (de forma resumida)
function aleatorio(inferior,superior){
var resAleatorio = Math.floor((Math.random() * (superior - inferior + 1)) + inferior);
return resAleatorio;
}

Tórtola

25/2/2014
OBTENCION DE NUMERO ALEATORIO
También se puede usar el módulo de la división para obtener un número aleatorio, con más posibilidades de que salgan todos los números por igual:

function aleatorio(minimo,maximo){
var rang=maximo-minimo; // obtenemos el divisor a utilizar
var faleat=Math.floor(Math.random() * 1000); //obtenemos un número entero aleatorio del 0 al 999
var aleat=faleat%rang; // obtenemos su módulo (resto entero de la división) por el divisor
return aleat+minimo; //le añadimos el mínimo para que esté dentro del rango solicitado
}

Compartir