Obtener un numero aleatorio sin que se repita
La funcion Math.random() nos permite obtener un valor aleatorio entre 1 y 0, por ejemplo 0.261661368887872.
Para obtener un valor entre dos numeros en concreto podemos utilizar la siguiente función:
-
function aleatorio(min:Number, max:Number):Number {
-
var num:Number = Math.floor(Math.random()*(max-min+1))+min;
-
return num;
-
}
Y para optener el numero aleatorio de entre 1 y 5 utilizaremos el siguiente código
-
var numeroNuevo:Number = aleatorio(1, 5);
Ahora crearemos una listado de los numeros que ya yan sido utilizados. Para eso crearemos un Array.
-
var usados:Array = new Array();
Y modificaremos la funcion aleatorio para que añada cada numero obtenido al listado
-
function aleatorio(min:Number, max:Number):Number {
-
var num:Number = Math.floor(Math.random()*(max-min+1))+min;
-
usados.push(num);
-
return num;
-
}
Podemos obtener el registro de los numeros obtenidos visualizando el Array
trace(usados)
El resultado serÃa por ejemplo [1,3,2,1,4,4]
Para hacer que no se repitan los numeros crearemos una funcion que compruebe en el Array que el numero obtenido conla función aleatoria no haya sido ya utilizado.
-
function repetido(num:Number):Boolean {
-
var repe:Boolean = false;
-
for (i=0; i<usados.length; i++) {
-
if (num == usados[i]) {
-
repe = true;
-
}
-
}
-
return repe;
-
}
Esta función compara el numero introducido como parametro con todos los numero que contiene el Array, en el caso de que coincida devolverá true y en el caso que no devolverá false.
Modificaremos la función aleatorio() para que realice una consulta a la función repetido() para saber si el numero obtenido ya ha sido usado, y en el caso que sea asà busque otro.
-
function aleatorio(min:Number, max:Number):Number {
-
while (repe != false) {
-
var num:Number = Math.floor(Math.random()*(max-min+1))+min;
-
var repe:Boolean = repetido(num);
-
}
-
usados.push(num);
-
return num;
-
}
Ahora solo queda controlar el caso de que ya no queden numeros sin usar.
Para esto compararemos la diferencia entre los numeros del intervalo y la cantidad de numeros que contiene el Array, en el caso de que sean iguales querrá decir que ya no quedan numeros libres. La función aleatorio() quedarÃa de la siguiente manera:
-
function aleatorio(min:Number, max:Number):Number {
-
if (usados.length<=(max-min)) {
-
while (repe != false) {
-
var num:Number = Math.floor(Math.random()*(max-min+1))+min;
-
var repe:Boolean = repetido(num);
-
}
-
usados.push(num);
-
return num;
-
} else {
-
return null;
-
}
-
}
Si quisiesemos crear un boton que nos obtuviera nu numero del 1 al 5 serÃa este:
-
boton.onRelease = function() {
-
var numeroNuevo:Number = aleatorio(1, 5);
-
trace(numeroNuevo);
-
};
El resultado de clicar sobre él 6 veces serÃa, por ejemplo:
1
3
4
2
null
Este recurso lo podemos utilizar para cargar peliculas, videos, fotos, audios de forma aleatoria:
-
var num:Number = aleatorio(1, 20);
-
loadMovie("foto"+num+".jpg", foto);
Post relacinonados:
10 Comments »
RSS feed for comments on this post. TrackBack URI










hola mi nombre es greiman garcia me gustaria que pro favor me ayuden a crear un scrip que poseea 20 preguntas las cuales deven escogerse aleatoriamente 6 con la funcion random mi mail es scanman113@msn.com
Hola, me gustarÃÂa saber si ese script se puede aplicar a un random entre fotogramas concretos. Por ejemplo entre el fotograma número 90 y 100
gracias
@Halukar: ¿te refieres a obtener número entre le 90 y el 100?
Lo único que tendrÃÂas que hacer es pasarle esos valores como parámetros de la función:
aleatorio(90, 100);Este script debe ser mejorado sustancialmente . Si la lista de numeros es muy grande, puede tardar mucho tiempo en encontrar un elemento no repetido. Lo mejor es sacar dos numeros aleatorios en (1,...,N) e ir permutando la lista inicial x_1, ..., x_N un numero de veces, por ejemplo N/2. Este metodo de "barajar" es muy eficiente.
La mejor manera es que a medida que vayan saliendo los numeros se vallan eliminando de la lista, asi no se tiene que comprobar si ya an sido seleccionados o no y la eficiencia del codigo sera mucho mas alta
el mismo codigo se podria optimizar bastante si el return de la funcion buscar se mete adentro del bucle, de ese modo apenas encuentra el numero en el arreglo deja de iterar, no tiene sentido seguir buscando algo que ya encontraste.
for (i=0; i
Este codigo contiene algunos errores los modifiqué y kedo perfecto otsugua08@gmail.com
me gusta mucho esta paagina y me parese que me sirvira la informacion de esta pagina, gracias
Muy bueno el truco
Una cosa, ¿es muy complicado hacer que en lugar de devolver "null" reinicie la función de nuevo? Cómo lo hago
la variable repe, la primera vez que entra no esta definida y tira error. habria que setearla primero como false.
function aleatorio(min:Number, max:Number):Number
{
var repe:Boolean = true;
if (usados.length<=(max-min))
{
while (repe != false)
{
var num:Number = Math.floor(Math.random()*(max-min+1))+min;
repe= repetido(num);
}
usados.push(num);
return num;
}
else
{
return 0;
}
}