Auswahl von 2 zufälligen Elementen aus dem Array

8

Was ist der effizienteste Weg, um zwei eindeutige zufällige Elemente aus einem Array auszuwählen (dh stellen Sie sicher, dass das gleiche Element nicht zweimal ausgewählt wird).

Ich habe bisher:

%Vor%

Aber das hängt oft meine Seitenladung.

Jede bessere Lösung?

Extra Frage, wie erweitere ich das auf n elements

    
zsquare 15.03.2012, 12:13
quelle

7 Antworten

24

KEINE Schleifen und Vergleiche verwenden. Stattdessen

  • mische das Array
  • nimm die ersten beiden Elemente
georg 15.03.2012, 12:23
quelle
4

Ihr Code wird hängen, wenn die Liste nur ein Element enthält. Anstatt == zu verwenden, empfehle ich === , was in diesem Fall besser aussieht.

Verwenden Sie auch Math.floor anstelle von Math.ceil . Die Eigenschaft length ist gleich <highest index> + 1 .

%Vor%     
Rob W 15.03.2012 12:14
quelle
4

Ссылка

  

_. Beispiel (Liste, [n])

     

Erzeugt eine Zufallsstichprobe aus der Liste. Übergeben Sie eine Zahl, um n zufällige Elemente aus der Liste zurückzugeben. Andernfalls wird ein einzelnes zufälliges Element zurückgegeben.

%Vor%

Wenn Sie die Quelle betrachten, verwendet sie shuffle wie @ thg435 vorgeschlagen.

    
Michal Stefanow 16.03.2014 21:57
quelle
2

Wenn Sie n random Elemente erhalten möchten, könnten Sie eine gemischte Version Ihrer Liste erstellen und dann die ersten n Elemente des gemischten Array als Ergebnis zurückgeben.

    
sietschie 15.03.2012 12:22
quelle
2

Was Rob W dir gesagt hat, ich füge hinzu, dass eine andere Lösung wäre, einen zufälligen Punkt zu finden und für den zweiten Punkt einen zufälligen Offset von dem Punkt zu finden:

%Vor%

Wir fügen 1 hinzu, weil das aktuelle Element nicht erneut ausgewählt werden kann, und subtrahiere 1, weil ein Element bereits ausgewählt wurde.

Zum Beispiel ein Array von drei Elementen (0, 1, 2). Wir wählen zufällig das Element 1. Jetzt sind die "guten" Offset-Werte 0 und 1, wobei Offset 0 das Element 2 und Offset 1 das Element 0 ergibt.

Beachten Sie, dass Sie dadurch zwei zufällige Elemente mit verschiedenen INDEX erhalten, nicht mit einem anderen WERT!

    
xanatos 15.03.2012 12:22
quelle
0

Wenn Sie das Array mischen und die Anzahl der Elemente, die Sie zurückgeben möchten, spleißen, Der Rückgabewert enthält so viele Elemente wie möglich. wenn Sie nach mehr Gegenständen als in der Anordnung fragen. Sie können das tatsächliche Array oder eine Kopie mit slice () mischen.

%Vor%

Wenn Sie die ausgewählten Elemente aus dem ursprünglichen Array entfernen möchten, damit ein zweiter Aufruf nicht die Elemente enthält, die der erste Aufruf zurückgegeben hat, ein zweites Argument übergeben: getRandom (3, true);

%Vor%     
kennebec 15.03.2012 12:37
quelle
0

Dies kann mit der integrierten Funktionalität erfolgen ( Slice und sort ) ,

%Vor%     
Mehdi Dehghani 27.02.2018 18:44
quelle

Tags und Links