wake-up-neo.com

Sortieren eines Arrays in zufälliger Reihenfolge

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

12

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);

7
Jin

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.

Wie es wirklich funktioniert

  • Ist der Rückgabewert von Array.sort() positiv , dann ist der Index des ersten Parameters höher als das des zweiten.
  • Wenn es negativ ist , dann ist der Index des zweiten Parameters höher als der des ersten.
  • Und wenn es 0 Ist, dann nichts tun.
10
rv7

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.

Sie können hier mehr über Math.random () lesen.

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: -

  1. 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.

  2. 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.

5
Code Maniac

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;
}
1
Kresimir

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

1
Vivick

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:

  1. Kleiner als null, wenn A <B
  2. Ist gleich Null, wenn A = B
  3. Größer die Null, wenn A> B

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.

0
yunzen