Avatar billede larsholmgaard_dk Nybegynder
07. marts 2002 - 11:58 Der er 10 kommentarer og
2 løsninger

(0,0,1,2,3) ->ryste array!-> (0,1,3,2,0)

Den kryptiske overskrift dækker såmænd bare over at jeg mangler en funktion til at 'shake' en array, en form for 'unsort' funktion.

Jeg har en sorteret array fx. (0,0,0,1,1,2,2,2,3,3,3) og den skal mixes, så tallene står i tilfældig rækkefølge...

...er der nogen der har en god idé her, uden det bliver noget rodekode?

På forhånd mange tak!
mvh
Lars
Avatar billede Slettet bruger
07. marts 2002 - 12:15 #1
Avatar billede gotcha Nybegynder
07. marts 2002 - 12:57 #2
Det nemmeste er at bruge en prototype (bare indsæt den f.eks. i den første frame på hovedtidslinien):

Array.prototype.shuffle = function() {
    var len = this.length;
    for (var i=0; i < len; i++) {
        var rand = Math.floor(Math.random()*len);
        //swap current index with a random one
        var temp = this[i];
        this[i] = this[rand];
        this[rand] = temp;
    }
}

Du kan finde mere om denne på http://www.layer51.com/proto/d.asp?p=3&f=147 .

For at sortere dit array på en vilkårlig måde, skal du såmænd bare skrive mitArray.shuffle(). Koden kan se sådan ud:

mitArray = [0,0,0,1,1,2,2,2,3,3,3];
mitArray.shuffle();

Så er dit array sorteret på en vilkårlig måde :)

Håber det kan bruges.

Mvh Morten
Avatar billede larsholmgaard_dk Nybegynder
07. marts 2002 - 13:20 #3
d!ktator - hvad skal jeg sige? Jeg har lige brugt 10 minutter med en kollega for at finde ud af hvorfor i alverden det virkede det som du foreslog. Det vi kom frem til var at Flash's interne sorteringsrutine nok bruger Bubblesort metoden og at arrayet netop bliver sorteret tilfældigt fordi sort() funktionen kalder sig selv rekursivt med et variabelt argument der indikerer om der skal sorteres op, ned eller ingenting.

TOTAL i orden Flashkode!!! Først fattede jeg simpelthen ikke hvorfor din kode virkede, men det gør vi så nu - hehe!!

Jeg vil gerne dele pointene mellem jer, for gotcha, dit svar er også glimrende.

Tak for den hurtige hjælp.

mvh
Lars
Avatar billede larsholmgaard_dk Nybegynder
07. marts 2002 - 13:46 #4
d!ktator, hvis du lige laver et svar så får du halvdelen af pointene.
Avatar billede Slettet bruger
07. marts 2002 - 13:51 #5
Jeg er ikke klar over om Flash gør brug af Bubblesort metoden eller en anden rekursiv sorteringsfunktion.
Men det virker når funktionen bliver kaldt med paramtre ( -1,0,1 )

Mvh/M!chael
Avatar billede barklund Nybegynder
08. marts 2002 - 13:39 #6
Lidt matematik:

At sortere en liste hurtigst gøres ved at tage den elementvist fra en ende af og bytte elementet ud med et tilfældigt. Det har en WCE (Worst Case Execution" på O(n) - altså direkte proportionelt med n (antal elementer)... Denne tilgang bruger gotchas eksempel som også er den hurtigste... Jeg tror måske nok, at jeg kunne optimere en lille smule, men ikke meget... Og dog... Hurtigere endnu er:

Array.prototype.shuffle = function() {
    var l = this.length;
    for (i in this) {
        var r = random(l);
        var t = this[i];
        this[i] = this[r];
        this[r] = t;
    }
}

Den kører hurtigere, da den for det første bruger kortere navne (minimalt men eksisterende performance-gain) og derudover bruger for-in-strukturen... Denne er utrolig hurtig til at gennemløbe et array, hvis man blot skal løbe alle elementer igennem på et eller anden tidspunkt. Den tager nemlig ikke nødvendigvis elementerne i rækkefølge, men det er jo også ligemeget... Helt teknisk, så er for-in-løkken den eneste løkke, der benytter sig af stack-registrene i Flash-fortolkeren... Det kan man selvfølgelig manipulere sin for-løkke til vis assembler-kode... Læs meget mere om dette på http://flash.sourceforge.net



Mht. diktators løsning, så udnytter hans løsning nogle helt andre aspekter af flash, nemlig den indbyggede sorteringsalgoritme, der kan tage en sorteringsfunktion...

Ideen i dette er, hvis man nu har nogle andre elementer i sig array end blot tal eller strenge, men måske objekter, så kan man stadig sortere - fx:

mitArray = new Array();
mitArray[0] = {fornavn:"Morten", efternavn:"Barklund"};
mitArray[1] = {fornavn:"Lars", efternavn:"Holmgård"};
mitArray[2] = {fornavn:"Michael", efternavn:"Diktator"};
mitArray[3] = {fornavn:"Hans", efternavn:"Jensen"};

Dette kan jo ikke sorteres ved hjælp af de almindelige <, > eller ==. Så kan man lave sin egen sorteringsfunktion:

function sorterFornavn(a,b) { //to tilfældige elementer
    if (a.fornavn < b.fornavn) {
        return -1;
    } else if (a.fornavn > b.fornavn) {
        return 1;
    } else {
        return 0;
    }
}

For man skal nemlig returnere -1, hvis a kommer før b, 0 hvis de er ens og 1 hvis a kommer efter b... Sorter efter efternavn er selvfølgelig bare:

function sorterEfternavn(a,b) {
    if (a.efternavn < b.efternavn) {
        return -1;
    } else if (a.efternavn > b.efternavn) {
        return 1;
    } else {
        return 0;
    }
}

Disse kaldes så med:

mitArray.sort(sorterFornavn);
mitArray.sort(sorterEfternavn);

Læs mere på http://www.macromedia.com/support/flash/action_scripts/objects/arraysort.html

Flash's sorteringsalgoritme er en sløv slavealgoritme (ikke rekursiv - tror nok den hedder "sort by insertion"/"insertion sort") der løber O(n*n) - altså proportionel med kvadratet på n = sløvt!

En god sorteringsalgoritme som quicksort løber O(n*log n). Flash-implementeringerne af denne kan findes rundt omkring...

Men hvorfor virker diktators eksempel så, som en shuffle, når den bruger sort()? Det skyldes blot, at hver gang sort() kalder din sorteringsfunktion, så får den tilfældigt enten -1, 0 eller 1, så den placerer elementer tilfældigt i forhold til hinanden...

Håber det gav indsigt...

/Barklund
Avatar billede barklund Nybegynder
08. marts 2002 - 13:57 #7
Ovenover er der en fejl i et link - det rigtige er http://flasm.sourceforge.net
Avatar billede Slettet bruger
08. marts 2002 - 15:25 #8
Nice :-)
Avatar billede larsholmgaard_dk Nybegynder
11. marts 2002 - 09:55 #9
Tusinde tak fordi du gad bruge tid på at forklare det så dybdegående! Det sætter jeg stor pris på.
Avatar billede Slettet bruger
11. marts 2002 - 10:01 #10
Barklund >> Må jeg bruge din post til en artikel på flashfaq.dk ??
Avatar billede barklund Nybegynder
14. marts 2002 - 02:13 #11
Diktator >> Teføli... :o)
Avatar billede Slettet bruger
14. marts 2002 - 11:44 #12
Thanx :)
Jeg faldt i øvrigt over den her, som bruger while istedet for 'for..in'

Array.prototype.shuffle = function() {
var l = this.length;
var i = l;
while (i--) {
var p = random(l);
var t = this[i];
this[i] = this[p];
this[p] = t;
}
}

Vil du kommentere den :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester