Obtener elementos de un listado de forma aleatoria sin que se repitan

Posted by admin | Básico, Flash | Tuesday 30 May 2006 1:33 am

El método Array.splice() obtiene elementos de un Array eliminándolos de la matriz. Esto nos puede ser útil para obtener elementos (ya sean números o cadenas de texto) de forma aleatoria y sin que se repitan.

Tenemos, por ejemplo, este listado de personas:

var listado:Array = Array("Guillermo", "Lucas", "David", "Roger", "Bruno", "Iñaki", "Alex", "Carlos");

Para obtener un nombre de forma aleatoria utilizariamos la función Math.random():

aleatorio = Math.floor(Math.random()*(listado.length));
seleccion = listado[aleatorio]
trace(seleccion)

Si al obtener un nombre lo eliminamos del Array con Array.splice():

listado.splice(aleatorio, 1);

La próxima vez que queramos obtener otro nombre del listado este no estará y así evitaremos que se repita.

Con la función for() obtendremos los nombres mientras queden disponibles en el listado

var listado:Array = Array("Guillermo", "Lucas", "David", "Roger", "Bruno", "Iñaki", "Alex", "Carlos");
var Total:Number = listado.length;
for (i=0; i<Total; i++) {
aleatorio = Math.floor(Math.random()*(listado.length));
seleccion = listado[aleatorio];
trace(seleccion);
listado.splice(aleatorio, 1);
}

El resultado sería, por ejemplo:

Iñaki
Guillermo
Bruno
Lucas
Carlos
David
Roger
Alex
Comparte:
  • Meneame
  • Twitter
  • Facebook
  • LinkedIn
  • Google Bookmarks
  • del.icio.us
  • Technorati
  • email
  • Print

Post relacinonados:

  1. Obtener un numero aleatorio sin que se repita
  2. Ordenar elementos de un Vector en Actionscript 3
  3. Precargas múltiples de SWF y JPG simultanea en un sólo preload
  4. Clase de Actionscript 3 para arrays multidimensionales

5 Comments »

  1. Comment by zah — 9 September, 2010 @ 2:31 pm

    Jojo uno de los posts más interesantes en el foro de as iba sobre eso: http://www.cristalab.com/foros/viewtopic.php?t=17461&highlight=aleatorio+array

  2. Comment by maframaran — 19 November, 2008 @ 10:27 am

    La verdad no se si alguien conteste a esto, pero me gustaria que los que vean este post tengan en cuenta que el array siempre llega hasta su tamaño -1, lo cual implica que al el metodo Math.ramdom suelte un valor mayor o igual a 0.9 y este sea multiplicado por el tamaño del vector el resultado, gracias al metodo math.floor va a ser igual al tamaño del vector, lo cual vendria a lanzar una excepcion y bulgarmente hablando explotaria el programa. Les recomiendo consideren esto y a su vez validen que el valor a buscar en el array no se igual a su tamaño. En su defecto, si no tengo razon en lo que estoy diciendo y me estoy equivocando por favor corrijanme.

  3. Comment by novato — 6 May, 2010 @ 2:04 am

    Gracias!!! He aprendido algo mas!!

  4. Comment by holanda — 17 June, 2010 @ 5:14 pm

    No funciona una mierda lo q pusiste!

  5. Comment by Javjav — 18 June, 2010 @ 9:34 am

    Hola, este scipt sigue siendo válido aún con el AS3.

    Ahora bien, habría que actualizar la declaración del Array, puesto que en AS3, hay que considerar la clase de objeto en la declaración de esta otra manera:
    var listado:Array = new Array("Guillermo", "Lucas", "David", "Roger", "Bruno", "Iñaki", "Alex", "Carlos");

    A titulo personal y debido a los cambios más estrictos de la escritura en AS3, también recomiendo declarar las variables antes de utilizarlas, por ejemplo:

    var Total:Number;
    var aleatorio:Number;
    var seleccion: String ="";

    y luego más adelante...donde declaramos las funciones a utilizar.....

    function aleatorios():void {

    aleatorio = Math.floor(Math.random()*(listado.length));
    seleccion = listado[aleatorio];
    trace(seleccion);
    listado.splice(aleatorio, 1);
    Total = listado.length;
    trace("el numero de elementos ahora es "+Total);

    }

    Por lo que comentas maframaran, podría suponer un problema ...aunque no he entendido la explicación al 100%. He ejecutado la función varias veces aún cuando ya no quedaban elementos del array a seleccionar , dándome como resultado "null" y no parece haber dado ningún problema.

    Por favor ¿podrias explicarlo de nuevo con un ejemplo?

    Gracias.

RSS feed for comments on this post. TrackBack URI

Leave a comment

Get Adobe Flash playerPlugin by wpburn.com wordpress themes