Comunidad de diseño web y desarrollo en internet online

Desordenando un array!!

Citar            
MensajeEscrito el 10 May 2006 12:21 am
Saludos!

Alguien tiene una funcion rapida para desordenar los elementos de un array?, ejemplo: tengo un array asi [0,1,2,3,4,5] y quiero que al azar quede diferente ejemplo [2,5,0,3,1]

Lo he intentado con un pequeño codigo que hice, pero siento que tarda mucho pues Math.random me genera demasiadas veces el mismo numero y pues eso hace procesar de mas.

Gracias

Por heberto

263 de clabLevel

1 tutorial

1 ejemplo

 

Morelia, Michoacán

firefox
Citar            
MensajeEscrito el 10 May 2006 02:18 am

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

clabbrowser
Citar            
MensajeEscrito el 10 May 2006 07:34 am

Código :

function mezclar(bar){
   var m= bar.length-1;
   for (var i=m;i>1;i--){ 
      alea=Math.floor(i*Math.random()); 
      temp=bar[i]; 
       bar[i]=bar[alea]; 
       bar[alea]=temp; 
    }
   return(bar);
}

arr=[1,2,3,4,5,6,7,8,"casa","barco"];
mezclar (arr);
trace(arr); //8,5,4,barco,2,3,1,6,7,casa

Por Teseo

SWAT Team

1780 de clabLevel

14 tutoriales

Genero:Masculino   SWAT

firefox
Citar            
MensajeEscrito el 10 May 2006 03:30 pm
Gracias por su respuesta, tambien encontre este prototipo que funciona muy bien y es un poquito mas corto. a ver que opinan...

Código :

Array.prototype.desordenar = function () {
   for (var x=0, y=this.length;x<this.length;x++,y--) {
      this.push(this.splice(random(y), 1))
   }
}


Muchas gracias por su atencion, estamos en contacto

Por heberto

263 de clabLevel

1 tutorial

1 ejemplo

 

Morelia, Michoacán

firefox
Citar            
MensajeEscrito el 10 May 2006 05:20 pm
Tu mismo.
A qué llamas " un poquito mas corto"? :?
Prueba esto:

Código :

function mezclar(bar){
   var m= bar.length-1;
   for (var i=m;i>1;i--){ 
      alea=Math.floor(i*Math.random()); 
      temp=bar[i]; 
       bar[i]=bar[alea]; 
       bar[alea]=temp; 
    }
   return(bar);
}

Array.prototype.desordenar = function () {
   for (var x=0, y=this.length;x<this.length;x++,y--) {
      this.push(this.splice(random(y), 1))
   }
}
ciclos= 500;
a=[];
for (v=0; v< ciclos; v++){
   a[v]=v;
}
T=getTimer();
mezclar(a); 
trace("Tiempo con mezclar: "+(getTimer()-T));
T=getTimer();
a.desordenar(); 
trace("Tiempo con desordenar: "+(getTimer()-T));


Para 100 elementos(ciclos) mezclar es 20 veces más rápido que desordenar.
Para 500 elementos mezclar es 100 veces mas rápido que desordenar.
Para 2000 elementos mezclar es 400 veces!! mas rápido que desordenar.
y la progresion es GEOMETRICA. para 10000 ciclos puedes pasarte un buen rato esperando, de orden de 40 segundos :zzz: ........con mezclar para 10000 ciclos 0,3 segundos!!!:lol:

Repito: Tu mismo. :crap:

Y si lo quieres en prototype ( este es casi el doble de rápido que la función mezclar) :P

Código :

Array.prototype.desordenar = function () {
   var m= this.length-1;
   for (var i=m;i>1;i--){ 
      var alea=Math.floor(i*Math.random()); 
      var temp=this[i]; this[i]=this[alea]; this[alea]=temp; 
    }
}


Este prototype tarda en mi ordenador 2354 ms. en 100.000 ciclos y con mezclar 4215 ms.
El prototype que propones...........simplemente se cuelga.

Por Teseo

SWAT Team

1780 de clabLevel

14 tutoriales

Genero:Masculino   SWAT

firefox
Citar            
MensajeEscrito el 11 May 2006 03:12 pm
Orale, muchas gracias Teseo, la verdad no lo habia comparado y como me puse a investigar en otros sitios, lo encontre, en cuanto a corto, me referia a que era mas pequeño el codigo, pero como me lo has hecho ver, no importa la cantidad sino la calidad!, ademas de que finalmente opte por usar el que me propusiste, ya que ese prototipo no me ordena bien arrays que tienen dentro objetos, buena observacion y muchas gracias :)

Por heberto

263 de clabLevel

1 tutorial

1 ejemplo

 

Morelia, Michoacán

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.