Home » Básico »Trucos » Currently Reading:

Obtener un numero aleatorio sin que se repita

marzo 9, 2006 Básico, Trucos 25 Comments
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:

  1. function aleatorio(min:Number, max:Number):Number {
  2. var num:Number = Math.floor(Math.random()*(max-min+1))+min;
  3. return num;
  4. }

Y para optener el numero aleatorio de entre 1 y 5 utilizaremos el siguiente código

  1. var numeroNuevo:Number = aleatorio(1, 5);

Ahora crearemos una listado de los numeros que ya yan sido utilizados. Para eso crearemos un Array.

  1. var usados:Array = new Array();

Y modificaremos la funcion aleatorio para que añada cada numero obtenido al listado

  1. function aleatorio(min:Number, max:Number):Number {
  2. var num:Number = Math.floor(Math.random()*(max-min+1))+min;
  3. usados.push(num);
  4. return num;
  5. }

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.

  1. function repetido(num:Number):Boolean {
  2. var repe:Boolean = false;
  3. for (i=0; i<usados.length; i++) {
  4. if (num == usados[i]) {
  5. repe = true;
  6. }
  7. }
  8. return repe;
  9. }

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.

  1. function aleatorio(min:Number, max:Number):Number {
  2. while (repe != false) {
  3. var num:Number = Math.floor(Math.random()*(max-min+1))+min;
  4. var repe:Boolean = repetido(num);
  5. }
  6. usados.push(num);
  7. return num;
  8. }

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:

  1. function aleatorio(min:Number, max:Number):Number {
  2. if (usados.length !=(max-min)) {
  3. while (repe != false) {
  4. var num:Number = Math.floor(Math.random()*(max-min+1))+min;
  5. var repe:Boolean = repetido(num);
  6. }
  7. usados.push(num);
  8. return num;
  9. } else {
  10. return null;
  11. }
  12. }

Si quisiesemos crear un boton que nos obtuviera nu numero del 1 al 5 sería este:

  1. boton.onRelease = function() {
  2. var numeroNuevo:Number = aleatorio(1, 5);
  3. trace(numeroNuevo);
  4. };

El resultado de clicar sobre él 6 veces sería, por ejemplo:

  1. 5
  2. 1
  3. 3
  4. 4
  5. 2
  6. null

Este recurso lo podemos utilizar para cargar peliculas, videos, fotos, audios de forma aleatoria:

  1. var num:Number = aleatorio(1, 20);
  2. loadMovie("foto"+num+".jpg", foto);

UPDATE (17/10/2014):

Aquí está el código actualizado a Actionscript 3:

  1. var usados: Array = new Array();
  2.  
  3. function aleatorio(min: Number, max: Number): Number {
  4. if (usados.length != (max - min)) {
  5. var num: Number;
  6. var repe: Boolean = false;
  7. do {
  8. num = Math.floor(Math.random() * (max - min + 1)) + min;
  9. repe = repetido(num);
  10. } while (repe != false);
  11. usados.push(num);
  12. return num;
  13. } else {
  14. return 0;
  15. }
  16. }
  17.  
  18. function repetido(num: Number): Boolean {
  19. var repe: Boolean = false;
  20. for (var i = 0; i < usados.length; i++) {
  21. if (num == usados&#91;i]) {
  22. repe = true;
  23. }
  24. }
  25. return repe;
  26. }
  27.  
  28. var numeroNuevo: Number;
  29.  
  30. boton.addEventListener(MouseEvent.CLICK, function () {
  31. numeroNuevo = aleatorio(1, 5);
  32. trace(numeroNuevo);
  33. })&#91;/as]
  34.  
  35. <br><br>
  36. <h1>UPDATE (14/01/2015):</h1>
  37. 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.
  38.  
  39. El código actualizado sería el siguiente:
  40.  
  41. [as]// variables
  42. //------------------------------
  43. var total_clips: int = 12;
  44. var numero_min: int = 1;
  45. var numero_max: int = 12;
  46. var numeros_usados: Array = new Array();
  47. var clips_activos: Array = new Array();
  48.  
  49. // functions
  50. //------------------------------
  51. function inicializa_MovieClips(total_clips, numero_min, numero_max, numeros_usados) {
  52. for (var i: int = 1; i &lt;= total_clips; i++) {
  53. var clip: MovieClip = this['n' + i];
  54. clip.num.text = obtiene_aleatorio(numero_min, numero_max, numeros_usados);
  55.  
  56. clips_activos.push(i);
  57. }
  58. }
  59. //------------------------------
  60. function obtiene_aleatorio(min: int, max: int, numeros_usados: Array): int {
  61. if (numeros_usados.length != (max - min + 1)) {
  62. var numero: int;
  63.  
  64. do {
  65. numero = Math.floor(Math.random() * (max - min + 1)) + min;
  66. } while (numeros_usados.indexOf(numero) >= 0);
  67.  
  68. numeros_usados.push(numero);
  69. return numero;
  70. } else {
  71. return 0;
  72. }
  73. }
  74. //------------------------------
  75. function elimina_aleatorio(clips_activos): int {
  76. if (clips_activos.length > 0) {
  77. var numero: int = Math.floor(Math.random() * clips_activos.length);
  78. var numero_eliminado: int = clips_activos.splice(numero, 1);
  79.  
  80. return numero_eliminado;
  81. } else {
  82. return 0;
  83. }
  84. }
  85.  
  86. // handlers
  87. //------------------------------
  88. boton.addEventListener(MouseEvent.CLICK, function (e: MouseEvent) {
  89. if (clips_activos.length > 0) {
  90. var eliminado: int = elimina_aleatorio(clips_activos);
  91. var clip: MovieClip = e.target.parent['n' + eliminado];
  92. clip.num.text = "0";
  93. }
  94. });
  95. //----------------------------------------------------
  96.  
  97. inicializa_MovieClips(total_clips, numero_min, numero_max, numeros_usados);
  98.  
  99. 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 | Registro

Compártelo:

Obtener un numero aleatorio sin que se repita
Visto 165.369 veces

Currently there are "25 comments" on this Article:

  1. greiman dice:

    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

  2. Halukar dice:

    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

  3. admin dice:

    @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);

  4. Luisito dice:

    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.

  5. GisKaRD dice:

    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

  6. Erwin Ellicker dice:

    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

  7. m3ni4kx dice:

    Este codigo contiene algunos errores los modifiqué y kedo perfecto otsugua08@gmail.com

  8. chilurrio dice:

    me gusta mucho esta paagina y me parese que me sirvira la informacion de esta pagina, gracias

  9. lesbeziers dice:

    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

  10. Patricia dice:

    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;
    }
    }

  11. casd dice:

    El mismo FlshCS5 trae el codigo del numero aleatorio incluido.. esta en la herramienta de fragmento de codigos…

  12. Tao dice:

    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

  13. Renan Salazar dice:

    Excelente, justo lo que andaba buscando, ni mas ni menos… \o/
    Gracias.

  14. jere dice:

    funciona con as2?

  15. Liz dice:

    Los amooo son la mejor pagina de l mundo

  16. Victor Santillan dice:

    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. 😀

  17. David dice:

    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

  18. admin dice:

    @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); })

  19. Ivan Aguirre dice:

    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

  20. oscar dice:

    que post tan horrible, men si vas a postear algo, que al menos sirva, que mierda

  21. admin dice:

    @oscar: Comentas sobre un post de hace casi 9 años XD
    De todas maneras gracias por comentar 😉

  22. PolancoJ dice:

    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.

  23. admin dice:

    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 )

  24. lucas dice:

    Hola quisiera saber si me pueden ayudar ,quisiera saber como generar 5 números aleatorios entre 1 y 48

Comment on this Article:








Twitter: zguillez

AdvertisementAdvertisementAdvertisementAdvertisement

Recibe las novedades por email

Post destacado

Ordenar elementos de un Vector en Actionscript 3

22 ene 2009

En este ejemplo explicaré como ordenar elementos internos de un objeto de clase Vector en Actionscript 3. Para ordenar los elementos en realidad se realiza de igual manera que en un Array. Únicamente deberemos escribir una función que compare lo elementos según el orden que nos interese. El valor que nos ha de devolver la función que realiza la comparación deberá ser: 1: Si el primer valor es superior al segundo -1: si el primer valor es inferior al segundo 0: Si los valores son iguales De manera que si creamos un Vector con 10 numero aleatorios: var vector:Vector.<uint> = …



Map

Ranking

Codigoactionscript.org: 4.65 sobre 5 (106 valoraciones)

twitter-widget.com