[actionscript] Shuffle

kidloco

Power Member
Bem, precisava de um shuffle de arrays pro trabalho, como tal, comecei a martelar algo.

O Flash não tem nenhum array.shuffle() , nem sei bem porque...Anyway, fiz uma versão, e depois fui optimizando-a, como tal, vou apresentar aqui duas ou três maneiras diferentes de fazer um shuffle (existe sempre mais que um caminho eheh). Todas estão correctas por isso no stress :)

Basicamente um shuffle é pegar em algo, baralhar, e depois mostrar o resultado do baralhado. Ora, isso não é assim tão básico pois o flash não tem nenhum método (óbvio) para baralhar (um array neste caso).

Como conseguimos isso ? basicamente dentro de um loop, fazemos um random (ao total do array), pegamos no número que nos é dado pelo random, vamos ao array tirar esse valor e colocamos noutro novo array...e assim sucessivamente, até termos apagado o array inicial. Claro que esta foi a minha ideia inicial (expressada na versão 1). Depois com tempo, constatei que não precisava de um segundo array para nada. Podia simplesmente mexer os objectos dentro do array inicial (da versão 1 pra frente). Obviamente que as optimizações foram significando menos linhas de código (o que é bom senão não era optimizar eheh) :)


##### VERSAO 1 #####
Código:
 temp = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
 function shuffle(input:Array) {
     array2 = new Array();
     var total= input.length;
     for (i=0; i<total; i++) {
         var ran = Math.floor(Math.random()*((input.length-1)-0+1))+0;
         array2.push(input[ran]);
         input.splice(ran, 1);
     }
     return array2;
 }
 trace(shuffle(temp))


Daqui pra frente entramos no mundo dos prototypes.. the true power of flash (OOP - Object Oriented Programing) :)


##### VERSAO 2 #####
Código:
temp = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
 Array.prototype.shuffle = function () {
     var total = this.length;
     for (i = 0; i < total; i++) {
         var ran = Math.floor(Math.random()*((this.length-1)-0+1))+0;
          this.push(this[ran]);
          this.splice(ran, 1);
     }
     return this;
 };
 trace(temp.shuffle ())



##### VERSAO 3 #####
Código:
temp = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
 Array.prototype.shuffle = function () {
     var total = this.length
     for (i = 0; i < total; i++) {
         this.splice (Math.random () * this.length, 0, this.splice (Math.random () * this.length, 1))
     }
     return this
 }
 trace(temp.shuffle ())



##### VERSAO 4 (esta foi um ex colega meu que fez) #####
Código:
temp = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
 Array.prototype.shuffle= function () {
     this.sort (function (a, B) {
         i = Math.round ((Math.random () * 100) - 50)
         return i
     })
     return this
 }
 trace(temp.shuffle ())



Se quiserem que explique cada caso peçam. Obviamente isto não é pra iniciados...já convém saber como funciona a class Array e alguns dos seus métodos (push, splice).

Feel free to ask :)
 
Back
Topo