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:
- 5
- 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);
UPDATE (17/10/2014):
Aquí está el código actualizado a Actionscript 3:
- var usados: Array = new Array();
- function aleatorio(min: Number, max: Number): Number {
- if (usados.length != (max - min)) {
- var num: Number;
- var repe: Boolean = false;
- do {
- num = Math.floor(Math.random() * (max - min + 1)) + min;
- repe = repetido(num);
- } while (repe != false);
- usados.push(num);
- return num;
- } else {
- return 0;
- }
- }
- function repetido(num: Number): Boolean {
- var repe: Boolean = false;
- for (var i = 0; i < usados.length; i++) {
- if (num == usados[i]) {
- repe = true;
- }
- }
- return repe;
- }
- var numeroNuevo: Number;
- boton.addEventListener(MouseEvent.CLICK, function () {
- numeroNuevo = aleatorio(1, 5);
- trace(numeroNuevo);
- })[/as]
- <br><br>
- <h1>UPDATE (14/01/2015):</h1>
- He actualizado un poco el código para realizar la selección de números aleatorios y he montado una pequeña aplicación que lo implementa.
- El código actualizado sería el siguiente:
- [as]// variables
- //------------------------------
- var total_clips: int = 12;
- var numero_min: int = 1;
- var numero_max: int = 12;
- var numeros_usados: Array = new Array();
- var clips_activos: Array = new Array();
- // functions
- //------------------------------
- function inicializa_MovieClips(total_clips, numero_min, numero_max, numeros_usados) {
- for (var i: int = 1; i <= total_clips; i++) {
- var clip: MovieClip = this['n' + i];
- clip.num.text = obtiene_aleatorio(numero_min, numero_max, numeros_usados);
- clips_activos.push(i);
- }
- }
- //------------------------------
- function obtiene_aleatorio(min: int, max: int, numeros_usados: Array): int {
- if (numeros_usados.length != (max - min + 1)) {
- var numero: int;
- do {
- numero = Math.floor(Math.random() * (max - min + 1)) + min;
- } while (numeros_usados.indexOf(numero) >= 0);
- numeros_usados.push(numero);
- return numero;
- } else {
- return 0;
- }
- }
- //------------------------------
- function elimina_aleatorio(clips_activos): int {
- if (clips_activos.length > 0) {
- var numero: int = Math.floor(Math.random() * clips_activos.length);
- var numero_eliminado: int = clips_activos.splice(numero, 1);
- return numero_eliminado;
- } else {
- return 0;
- }
- }
- // handlers
- //------------------------------
- boton.addEventListener(MouseEvent.CLICK, function (e: MouseEvent) {
- if (clips_activos.length > 0) {
- var eliminado: int = elimina_aleatorio(clips_activos);
- var clip: MovieClip = e.target.parent['n' + eliminado];
- clip.num.text = "0";
- }
- });
- //----------------------------------------------------
- inicializa_MovieClips(total_clips, numero_min, numero_max, numeros_usados);
- stop();
Este ejemplo implica tener en el stage una serie de MoviClips llamados “n1”, “n2” etc…
Archivo .FLA de ejemplo:
*Debes de estar registrado para ver este contenido. Login | RegistroCompártelo:
Visto 165.369 veces
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;
}
}
El mismo FlshCS5 trae el codigo del numero aleatorio incluido.. esta en la herramienta de fragmento de codigos…
este codigo en que elementoº va?? es decir en el primer fotograma de la Escena o en el boton??, estoy tratando de implementer el random para poder nave gar entre fotogramas sin repeticion y tambien otto random que navegue entre las escenas.
de antemano gracias
Excelente, justo lo que andaba buscando, ni mas ni menos… \o/
Gracias.
funciona con as2?
[…] Numeros que no se repitan […]
Los amooo son la mejor pagina de l mundo
Hola , este código está genial , muchas gracias por subirlo, lo adapte a java y ahora nomas me falta adaptarlo al javascript del android.
Me resolviste un problema tenía maso la idea pero no me salía del todo. 😀
Buenas! Que tal? La verdad que trate de interpretar todo el codigo pero hay un par de cosas que no entiendo.. Tal vez es por la version de as.. es as3? Cuando lo quise aplicar me tira error y no funciona, otras veces se traba el programa.. Si alguien me pudiera ayudar se lo agradeceria.. Muchas gracias!
helix_k@hotmail.com
@David
Este código es antiguo y está escrito en AS2…
Aquí te lo he adaptado a AS3:
var usados: Array = new Array();
function aleatorio(min: Number, max: Number): Number {
if (usados.length != (max - min)) {
var num: Number;
var repe: Boolean = false;
do {
num = Math.floor(Math.random() * (max - min + 1)) + min;
repe = repetido(num);
} while (repe != false);
usados.push(num);
return num;
} else {
return 0;
}
}
function repetido(num: Number): Boolean {
var repe: Boolean = false;
for (var i = 0; i < usados.length; i++) { if (num == usados[i]) { repe = true; } } return repe; } var numeroNuevo: Number; boton.addEventListener(MouseEvent.CLICK, function () { numeroNuevo = aleatorio(1, 5); trace(numeroNuevo); })
necesito saber como hacerle para que al momento de generar un código o serie sea en consecutivo y al cerrar y abrir la apliación no se repitan los ya generados
que post tan horrible, men si vas a postear algo, que al menos sirva, que mierda
@oscar: Comentas sobre un post de hace casi 9 años XD
De todas maneras gracias por comentar 😉
Buenos dias amigo!
Mi nombre es Jose Polanco, te escribi por twitter el dia de ayer.
Me gustaria que me ayudaras un poco con esto de los numeros aleatorios.
Me estoy iniciando en esto de la programacion web asi que mis conocimientos son pocos (por no decir que nulos)
Mi inquietud es donde debo colocar este codigo?
En un formulario?
Debo colocarlo al principio? Al final?
Como muestro el resultado?
Estoy algo perdido? (En realidad muy perdido)
Agradezco tu ayuda y paciencia.
Gracias de antemano.
Hola José
Buff pues todo depende de como sea tu aplicación. No es que haya un sitio “exacto” donde colocarlo, o el hecho de mostrar el resultado dependerá tambien de la funcionalidad propia de tu aplicación…
En el caso del código que puse el el comentario anterior, que es para Actionscript 3 en Flash, debería ir colocado en el mismo fotograma donde esté colocado el Movieclip de botón.
Te paso un pequeño .FLA de ejemplo para que lo veas claro ( Coloco el archivo de descarga al final del post )
Hola quisiera saber si me pueden ayudar ,quisiera saber como generar 5 números aleatorios entre 1 y 48