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:
- 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:
Guillermo
Bruno
Lucas
Carlos
David
Roger
Alex
Compártelo:
Visto 112.502 veces
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
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.
Gracias!!! He aprendido algo mas!!
No funciona una mierda lo q pusiste!
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.
si funciona!!! #$#$# el que no lo sabe utilizar
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
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());