dominios y alojamiento web en hostalia

Generación de números aleatorios Javascript

26 de abril de 2002
Valoración del artículo:
Taller en el que se crea una función para generar números aleatorios en lenguaje Javascript.
Atención: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.
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.

Compartir en redes sociales

Comentarios
Fueron enviados 14 comentarios al artículo
9 comentarios no revisados
5 comentarios revisados:
Por: 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
Por: 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
Por: 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");
}
Por: 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");
}
Por: 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>


Manuales relacionados
Categorias relacionadas
El autor
Lectura recomendada
Compra este libro en Agapea, la librería urgente a domicilio.
Últimas noticias
Donaciones
Si piensas que te hemos ayudado y merecemos tu apoyo económico...