Home » Básico »Flash » Currently Reading:

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

mayo 30, 2006 Básico, Flash 8 Comments
Obtener elementos de un listado de forma aleatoria sin que se repitan

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:

  1. 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():

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

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

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

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

El resultado sería, por ejemplo:

Iñaki
Guillermo
Bruno
Lucas
Carlos
David
Roger
Alex

Compártelo:

Obtener elementos de un listado de forma aleatoria sin que se repitan
Visto 59.779 veces

Currently there are "8 comments" on this Article:

  1. zah dice:

    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. maframaran dice:

    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. novato dice:

    Gracias!!! He aprendido algo mas!!

  4. holanda dice:

    No funciona una mierda lo q pusiste!

  5. Javjav dice:

    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.

  6. Alberto dice:

    si funciona!!! #$#$# el que no lo sabe utilizar :)

  7. Eriberto dice:

    Una ayuda. Quiero obtener un array con varios elementos para lo cual quiero trabajar con un for{}
    Mas o menos asi .
    var miArray:Array=[1,2,3,4… ] Como lo hago por fis ayuda

  8. Matias dice:

    hola, yo he creado un código diferente para hacer algo similar a lo que se muestra en esta publicación, pero el mio pide una cantidad de números y los ordena aleatoreamente. el problema es que funciona de manera poco eficiente (funciona con 20 números aproximadamente)y quería saber si se les ocurre alguna idea para hacerlo mas eficiente, pero manteniendo mi idea.
    acá les dejo el código:

    N1=parseInt(prompt(“ingrese la cantidad de sujetos”));
    onload=myfunction()
    function myfunction()
    {
    listado=[]
    for(i=0;i<N1;i++)
    {
    N2=Math.floor((Math.random() * N1) + 1);
    listado.push(N2);
    }
    Array.prototype.unique=function(a){
    return function(){return this.filter(a)}}(function(a,b,c){return c.indexOf(a,b+1)<0
    });
    }
    while(listado.unique().length!=N1)
    {
    onload=myfunction()
    }
    document.write(listado.unique());

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