hurtig tip: hvordan tilfældigt shuffle et system i as3

, hurtigt tip: hvordan tilfældigt shuffle et system i as3,,,,, 4,,,,,,,,,,,,,,,, det cyber - mandag envato tuts + kurser vil blive reduceret til $3.- og' t miss.,, nogle gange har du en række punkter - - kunne være strenge, kunne være tal, kunne være ting, uanset hvad, - - hvis du vil, så randomise.det er særlig nyttigt for quizzer og hasardspil, men er nyttig i alle mulige andre ansøgninger.den letteste metode, jeg har fundet til at gøre det på er at holde alle de komponenter, der indgår i et system, og så det som et spil kort.men hvordan kan vi gøre det?,,,As a simple example, we'll use the letters of the alphabet:, var letters:Array = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"];,There are different approaches we can take to actually sorting this array., ,The Naive Approach,We could create a second array, and copy each element of the first into a random position in the second:, , ,The code for that might look like this (see this Quick Tip on getting a random integer within a specific range for more details):, var letters:Array = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]; var shuffledLetters:Array = new Array(letteris. længde), var randompos: int = 0 for (var - jeg: int = 0. jeg < letters.length; jeg + +) (randompos = int (matematik. random() * breve. længde); shuffledletters [randompos] = breve [i]), men der er et stort problem.hvad hvis de tilfældige holdning valgte, c, 6 samt?,,, en, bliver erstattet, og vil derfor ikke blive i generelt system.That's not what we want, so we need to check that the slot is empty before copying the letter over, and pick a different slot if it isn't:, var letters:Array = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]; var shuffledLetters:Array = new Array(letters.length); var randomPos:int = 0; for (var i:int = 0; i < letters.length; i++) { \trandomPos = int(Math.random() * letters.length); \twhile (shuffledLetters[randomPos] != null) //gentager, så længe det er ikke tomme (randompos = int (matematik. random() * breve. længde); //vælge en anden plads} shuffledletters [randompos] = breve [i]}, det virker.problemet er, at det er ineffektivt.se brev, er garanteret til at passe ind i sprækken valgt, fordi det er det første brev valgt, så alle de ankomst - og afgangstidspunkter vil være tom., b,, der er 25, 26 chance for, at den første tildeling af ankomst - og afgangstidspunkter taget vil være tom.når vi er halvvejs gennem alfabetet, denne chance falder til 50 /50.når vi når frem til, v, der er 50% chance for, at vi ikke kan finde et tomrum indtil det fjerde forsøg. det betyder, at vi er meget sandsynligt, at ringe til matematik. random(), wayyyyy mere end 26 gange.og matematik. random(), er en forholdsvis langsom funktion.hvad er en anden tilgang, vi kan tage?,, midt mand tilgang, hvis vi opbevares en liste over alle de tomme pladser i et tredje system, som vil svinde ind, som vi gik igennem dem?,,,,, - - og så på, at indtil den vifte af tomme ankomst - og afgangstidspunkter indeholder ingen elementer.The code for that would look like this:, var letters:Array = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]; var shuffledLetters:Array = new Array(letters.length); var emptySlots:Array = new Array(); for (var n:int = 0; n < letters.length; n++) { \temptySlots.push(n); } var randomPos:Number = 0; var actualSlot:Number = 0; for (var i:int = 0; i < letters.length; i++) { \trandomPos = int(Math.random() * emptySlots.length);\t\t//note emptySlots.length not letters.length \tactualSlot = emptySlots[randomPos]; \tshuffledLetters[actualSlot] = letters[i]; \temptySlots.splice(randomPos, 1); },Here we use the Array.splice() method to remove a single element fra listen af tomme pladser.det fjerner element snarere end blot sin værdi, nul,; så efter splejsning første sprække, emptyslots.length, vil være 25 i stedet for, 26,.,, splice(), funktion er stor, og vi kan bruge det til en tredje metode til at skovle, som fjerner denne mellemmand array.,, splejsning tilgang i stedet for at fjerne elementer fra den vifte af tomme pladser, når vi er færdige med dem, vi kan fjerne dem fra den oprindelige, unshuffled system. det lyder ikke særlig nyttigt først - - men hvad hvis vi valgte elementer fra den oprindelige, array tilfældigt, i stedet for at hente deres, bestemmelsessteder, tilfældigt?,,,,, - - og så videre, indtil det første system indeholder ingen elementer, i modsætning til de to andre modeller, ender vi med det originale system.Whether this is a problem or not depends on this project.,The code could look like this:, var letters:Array = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]; var shuffledLetters:Array = new Array(letters.length); var randomPos:Number = 0; for (var i:int = 0; i < shuffledLetters.length; i++)\t//use shuffledLetters.length because splice() will change letters.length { \trandomPos = int(Math.random() * letters.length); \tshuffledLetters[i] = letters[randomPos];\t//note this the other way around to the naive approach \tletters.splice(randomPos, 1); },In fact, since ,splice(), returns an ,Array, of all the elements you are splicing, we could simplify the code a little: ,, var letters:Array = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]; var shuffledLetters:Array = new Array(letters.length); var randomPos:Number = 0; for (var i:int = 0; i < shuffledLetters.length; i++) { \trandomPos = int(Math.random() * letters.length); \tshuffledLetters[i] = letters.splice(randomPos, 1)[0];\t//since splice() returns an Array, we have to specify that we want the first (only) element },That's neater. I've got one more approach to share; this one is very different to the others we've used so far., ,The Sorting Approach,Arrays have a method, sort(), which by default rearranges all the elements of the array into ascending alphanumerical order, like so:, var mixedLetters:Array = ["G", "B", "P", "M", "F"]; mixedLetters.sort(); //mixedLetters is now ["B", "F", "G", "M", "P"],You can pass options to this method, like ,Array.DESCENDING,, which reverses the order of the sort:, var mixedLetters:Array = ["G", "B", "P", "M", "F"]; mixedLetters.sort(Array.DESCENDING); //mixedLetters is now ["P", "M", "G", "F", "B"],(There are other options, and you can pass as many of them as you like.),You can also pass a reference to a ,function,, which tel- flash, hvordan at bestemme, i hvilken rækkefølge de to ting hører hjemme i.for eksempel denne funktion kan anvendes til numeriske sortering:, funktion numericalsort a: antal, b: antal): nummer (hvis (< b) tilbage - 1; hvis (a = b) tilbage, 0; hvis a > b) afkast 1}, flash - på hvert par af tilstødende punkter i nettet, og flytter om på dem i henhold til denne funktion: det swaps, hvis værdi, 1, er vendt tilbage, og lader dem alene på anden måde.(medmindre du passerer, array.descending samt funktion, idet det i så fald swaps, hvis værdi - 1, er vendt tilbage, og lader dem alene ellers.) gentager dette på den række - igen og igen, indtil alle par tilbage, 0 eller - 1 (, 0, eller 1, hvis der anvendes, array. faldende). vi kan ødelægge det.i stedet for at give det en reel grund til, hvorfor de to elementer bør være byttet, vi kan bare fortælle det til at bytte dem tilfældigt, ved hjælp af en slags fungerer sådan her:, funktion randomsort a: *, b: *): antal //*: enhver form for input (hvis (matematik. random() < 0, 5) tilbage - 1; andre afkast 1}, rolig!Now we can use it in our code like so:, function randomSort(a:*, b:*):Number { \tif (Math.random() < 0.5) return -1; \telse return 1; } var letters:Array = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]; letters.sort(randomSort); //(no need for the shuffledLetters[] Array),Please note that the resulting array will not be as randomly shuffled as the other approaches we've used -- in this approach, there isn't an even 1/26 chance that ,any, given letter will end up in ,any, given slot. det er fordi, vi er kun at tilstødende par elementer, og ikke mere end det.men det er en god metode:), der er masser af andre metoder, det ved jeg.har du noget bedre end det?,, redigere: her er en stor post med nogle meget cool billeder, forklarer fisher yates shuffle, som arbejder på stedet.jeg vil stærkt anbefale det.,

















Previous:
Next Page: