2016-09-24 3 views
0

Hy Jungs. Ich mache ein Memory-Spiel und um das zu erreichen, musste ich Bilder in Array irgendwie mischen. Ich fand eine alte Antwort auf Stack Overflow, Fisher-Yates Shuffle, und benutzte das, und es funktioniert, aber ich verstehe nicht, wie. Kann jemand Schritt für Schritt erklären, was jedes Element in diesem Code darstellt? Vor allem die erste Zeile, wie gibt es drei Werte in einer Variablen. Vielen Dank.shuffle JavaScript Array

function shuffle(array) { 
    var currentIndex = array.length, temporaryValue, randomIndex; 

    // While there remain elements to shuffle... 
    while (0 !== currentIndex) { 

    // Pick a remaining element... 
    randomIndex = Math.floor(Math.random() * currentIndex); 
    currentIndex -= 1; 

    // And swap it with the current element. 
    temporaryValue = array[currentIndex]; 
    array[currentIndex] = array[randomIndex]; 
    array[randomIndex] = temporaryValue; 
    } 

    return array; 
} 

wie so verwendet:

var arr = [2, 11, 37, 42]; 
arr = shuffle(arr); 
console.log(arr); 
+0

Mögliche Duplikat von [Wie zufällig (Shuffle) ein JavaScript-Array?] (Http://stackoverflow.com/questions/2450954/how-to-randomize-shuffle-a-javascript-array) – vlaz

+0

Es sind nicht drei Werte in der ersten Zeile, sondern 3 verschiedene Variablen, wobei nur die erste mit der Array-Länge – eavidan

+0

initialisiert wird. Die Antwort im Duplikat enthält Ressourcen über Fisher-Yates. Allgemeiner gesagt, da dieser Algorithmus allgemein bekannt ist, können Sie ihn einfach googeln, um mehr zu erfahren. Es hat sogar eine Wikipedia-Seite. – vlaz

Antwort

0

In Teile zerlegen. Nehmen wir an, die Array-Länge ist n. Wir beginnen mit currentIndex = n, und wir werden bis currentIndex = 0 fortfahren, was bedeutet, dass alle Elemente mit einer Wahrscheinlichkeit iteriert und an einen Ort verschoben wurden.

innerhalb der Schleife bekommen, die erste Zeile hat zwei Funktionen

  • Math.random(): Erzeugt eine reelle Zufallszahl in range [0, 1). Ja, es in 1 offen ist, so dass es erzeugt keine 1 je
  • Math.floor(): Gibt den ganzzahligen Teil der reellen Zahl, um es als Parameter angegeben

Nun beobachten, Math.random()*currentIndex wird eine Zufallszahl in range [0, n) erzeugen (Grundmultiplikation). Math.floor() nimmt den ganzzahligen Teil, also haben wir eine ganze Zahl zwischen {0, 1, 2, ... n-1}. Dieser Wert ist randomIndex.

Jetzt tauschen wir einfach die Zahlen bei currentIndex und randomIndex aus. Wir tun dies für alle Elemente vom Ende an. Also wird das Array gemischt.

Dies ist jedoch kein sehr guter Shuffling-Algorithmus, da Sie den Umfang der Zufälligkeit bei jeder Iteration reduzieren. Ein besserer Shuffle wäre, die Zahlen paarweise mit Zufallszahlen zu verknüpfen und dann die Paare mit diesen gebundenen Zufallszahlen als Schlüssel zu sortieren und sie loszuwerden, damit das ursprüngliche Zahlenfeld gemischt wird.

0

Die erste Zeile ist eigentlich nur eine Abkürzung für drei Variablen auszuschreiben:

Also, das:

var currentIndex = array.length, temporaryValue, randomIndex; 

Verschiebt zu:

var currentIndex = array.length; // 4 
var temporaryValue;    // undefined 
var randomIndex;     // undefined 
+0

Erm, 'currentIndex' wird eine Nummer sein, nicht das Array. – vlaz

+0

@vlaz Danke. Guter Fang. – Guentersniden

0
var currentIndex = array.length, temporaryValue, randomIndex; 

Es sind keine drei Werte in einer Variablen, nur 3 Variablen mit einem deklarierten initialisiert und die anderen sind undefined.Besser formatieren Sie den Code wie folgt:

var currentIndex = array.length, 
    temporaryValue, 
    randomIndex; 

while (0 !== currentIndex) { 
    // ... 
    currentIndex -= 1; 
    // ... 
} 

Momentanindex wird array.length-0, so array.length Iterationen


randomIndex = Math.floor(Math.random() * currentIndex); 

Zufallszahl 0-currentIndex - 1


temporaryValue = array[currentIndex]; 
array[currentIndex] = array[randomIndex]; 
array[randomIndex] = temporaryValue; 

tauscht die Elemente an Position randomIndex und currentIndex.

Dies sollte Ihnen die Grundlagen geben, um diesen Code zu verstehen.

0
<p id="result"> 

<script> 
var arrayList= ['a','b','c','d','e','f','g']; 
arrayList.sort(function(){ 
    return 0.5 - Math.random() 
}) 

document.getElementById("result").innerHTML = arrayList; 

</script> 
+0

Dies liefert keine Antwort auf die Frage. Sobald Sie genug [Reputation] (https://stackoverflow.com/help/whats-reputation) haben, können Sie [jeden Beitrag kommentieren] (https://stackoverflow.com/help/privileges/comment); Stattdessen [geben Sie Antworten, die keine Klärung durch den Fragesteller erfordern] (https://meta.stackexchange.com/questions/214173/why-doe-i-need-50-reputation-to-comment-what-can- i-do-stattdessen). - [Aus Review] (/ review/low-quality-posts/18172627) –

+2

Während dieser Code die Frage beantworten kann, verbessert ein zusätzlicher Kontext, warum und/oder wie dieser Code die Frage beantwortet, seinen langfristigen Wert. –