Ich versuche zu verstehen, wie ein Array in zufälliger Reihenfolge sortiert wird. Also habe ich folgenden Code gefunden:
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0.5 - Math.random();
}
console.log(s);
meine Hauptfrage ist, warum sie 0.5 nicht eine andere Nummer verwenden ? und wie es wirklich funktioniert Bitte versuchen Sie es einfach zu machen
Du hast benutzt
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0.5 - Math.random();
}
console.log(s);
Und hier ist das Wichtigste ist as.sort(func)
.func(a,b)
gibt einen Wert im Bereich von [-0.5,0.5]
zurück.
Da diese Funktion 0.5 - Math.random()
und Math.random () zurückgibt, wird der Gleitkommawert zurückgegeben, der sich im Bereich von [0,1]
..__ befindet, sodass Ihre func
einen Wert im Bereich von [-0.5,0.5]
zurückgibt.
Dies bedeutet, dass die Sortierreihenfolge increase
oder decrease
..__ festgelegt wird. Dies ist zufällig . Ihr Ergebnis wird also zufällig sein
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return Math.random();
}
console.log(s);
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0 - Math.random();
}
console.log(s);
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0.5 - Math.random();
}
console.log(s);
Math.random () liefert eine Zahl zwischen 0
Und 1
(Exklusiv). Wir verwenden 0.5
, Da es sich um den Mittelwert handelt .
Array.sort () sortiert die Parameter basierend auf dem Rückgabewert . Also ergibt 0.5 - Math.random()
entweder positiver oder negativer Wert mit gleicher Wahrscheinlichkeit. Daher werden die Parameter sortiert zufällig.
Array.sort()
positiv , dann ist der Index des ersten Parameters höher als das des zweiten.0
Ist, dann nichts tun.Math.random () liefert einen zufälligen Wert zwischen 0 bis 1 (0 ist enthalten, 1 ist jedoch ausgeschlossen). Also fungieren 0,5 als Mittelpunkt. Wenn Sie einen Wert verwenden, der größer als 1 oder kleiner als 0 ist, ist dieser immer entweder wahr oder falsch. Aus diesem Grund wird also 0,5 verwendet.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random
Lassen Sie es uns mit Beispielen etwas besser verstehen
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0.5 - Math.random();
}
console.log(s);
Dies erhalten Sie, wenn Sie einen Wert größer als 1 verwenden
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 1 - Math.random();
}
console.log(s);
Dies passiert, wenn Sie einen Wert kleiner als 0 verwenden
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return -1 - Math.random();
}
console.log(s);
P.S: -
Versuchen Sie, die Ausgabe unter allen oben genannten Bedingungen zu drucken. Sie werden feststellen, dass die letzten beiden Bedingungen immer entweder "wahr" oder "falsch" von der Funktion zurückgeben. Sie erhalten also keine zufällige Sortierung.
Sprechen Sie jetzt über einen beliebigen Wert von 0 bis 0,99. Sie können einen beliebigen Wert verwenden, aber 0,5 erfüllt Ihren Zweck am besten. Weil dies ein Mittelwert ist, erhalten Sie am wahrscheinlichsten die beste Antwort.
Wenn Sie die Elemente nur zufällig in der Nähe ihrer Anfangspositionen verschieben möchten, verwenden Sie sort
mit random
. In den meisten Fällen ist dies jedoch nicht das, was Sie wollen. Sie möchten ein Array gründlich mischen, die Position jedes Elements vollständig randomisieren. Und für random
in der eingebauten sort
-Funktion ist es eine schreckliche Praxis, da sie auf den Anfangszustand ausgerichtet ist, was bedeutet, dass die Elemente in dem "gemischten" Array in der Nähe ihrer Positionen bleiben (diejenigen, die sich am Anfang befanden.) die hohe Wahrscheinlichkeit, nahe am Anfang zu bleiben, etc ...). Je größer das Array wird, desto weniger wird es gemischt.
Hier ist der Beweis: Ist die Verwendung der JavaScript Array.sort () - Methode für das Mischen korrekt?
Und hier ist die Funktion zum Mischen von Arrays, die ich meistens verwende. Es ordnet die Position jedes Elements völlig zufällig an.
function shuffle(arr) { // randomly rearanges the items in an array
const result = [];
for (let i = arr.length-1; i >= 0; i--) {
// picks an integer between 0 and i:
const r = Math.floor(Math.random()*(i+1)); // NOTE: use a better RNG if cryptographic security is needed
// inserts the arr[i] element in the r-th free space in the shuffled array:
for(let j = 0, k = 0; j <= arr.length-1; j++) {
if(result[j] === undefined) {
if(k === r) {
result[j] = arr[i]; // NOTE: if array contains objects, this doesn't clone them! Use a better clone function instead, if that is needed.
break;
}
k++;
}
}
}
return result;
}
Math.random
gibt eine Zahl zwischen 0 und 1 zurück.
Die Sortierfunktion verwendet den Rückgabewert x
wie folgt:
x == 0
: Gleicher Wert, kann "wie gewünscht" bestellen
x < 0
: Das erste Objekt ist kleiner als das zweite, daher ist sein Index im sortierten Array kleiner als der des anderen
x > 0
wie x < 0
aber andersherum
Da Math.random
eine Zahl zwischen 0 und 1 zurückgibt und wir auch negative Zahlen erhalten möchten, müssen wir einen Wert abziehen. Hier würde 0.5 - Math.random()
eine Zahl zwischen 0,5 und -0,5 angeben
Wenn Sie die sort
-Methode mit einem Funktionsparameter aufrufen, wird mehrmals aufgerufen. Diese Funktion sollte zwei Parameter akzeptieren (nennen wir das erste A und das zweite B). Jedes Mal sollte ein Wert zurückgegeben werden:
In diesem Beispiel benötigen wir Zufallsrückgabewerte, die negative und positive Werte gleichmäßig verteilen. Da Math.random()
einen Wert zwischen 0 und 1 zurückgibt, gibt 0.5 - Math.random()
Werte zwischen -0,5 und 0,5 zurück, was die Anforderungen erfüllt.