Ich arbeite daran, wie man zufällig aus einem Array in Javascript auf Elemente zugreift. Ich habe diesbezüglich viele Links gefunden. Wie: Holen Sie sich zufällige Elemente aus dem JavaScript-Array
var item = items[Math.floor(Math.random()*items.length)];
Dabei können wir jedoch nur ein Element aus dem Array auswählen. Wenn wir mehr als ein Element wollen, wie können wir dies erreichen? Wie können wir mehr als ein Element aus einem Array erhalten?
javascript
jquery
html
arrays
Shyam Dixit
quelle
quelle
Antworten:
Probieren Sie diese zerstörungsfreie (und schnelle ) Funktion aus:
quelle
Set
(der in '13 nicht verfügbar war: - /)Nur zwei Zeilen:
DEMO :
quelle
let random = array.sort(() => .5 - Math.random()).slice(0,n)
Hier gibt es eine einzigartige Einzeiler-Lösung
quelle
5 zufällige Elemente erhalten, ohne das ursprüngliche Array zu ändern:
(Verwenden Sie dies nicht für große Listen)
quelle
Portierung
.sample
aus der Python-Standardbibliothek:Implementierung portiert von Lib / random.py .
Anmerkungen:
setsize
wird basierend auf den Merkmalen in Python für die Effizienz festgelegt. Obwohl es nicht für JavaScript angepasst wurde, funktioniert der Algorithmus weiterhin wie erwartet.Array.prototype.sort
. Es wird jedoch garantiert, dass dieser Algorithmus in endlicher Zeit endet.Set
implementiert wurden, kann das Set durch einArray
und.has(j)
durch ersetzt werden.indexOf(j) > -1
.Leistung gegen die akzeptierte Antwort:
quelle
Erstellen Sie eine Funktion, die das tut:
Sie sollten auch überprüfen, ob das sourceArray über genügend Elemente verfügt, um zurückgegeben zu werden. Wenn Sie eindeutige Elemente zurückgeben möchten, sollten Sie das ausgewählte Element aus dem sourceArray entfernen.
quelle
sourceArray
mehrmals zurückgeben.ES6-Syntax
quelle
Wenn Sie Elemente in einer Schleife ohne Wiederholungen zufällig aus dem Array abrufen möchten, können Sie das ausgewählte Element aus dem Array entfernen mit
splice
:quelle
1
ist die ,deleteCount
die die Anzahl von alten Feldelemente zu entfernen. (Übrigens habe ich die letzten beiden Zeilen auf reduziertnewItems.push(items.splice(idx, 1)[0])
).quelle
Hier ist eine schön getippte Version. Es scheitert nicht. Gibt ein gemischtes Array zurück, wenn die Stichprobengröße größer als die Länge des ursprünglichen Arrays ist.
quelle
_.sample
und_.sampleSize
.Ruft ein oder n zufällige Elemente an eindeutigen Schlüsseln von der Sammlung bis zur Größe der Sammlung ab.
quelle
BEARBEITEN : Diese Lösung ist langsamer als andere hier vorgestellte (die das Quellarray spleißen), wenn Sie nur wenige Elemente erhalten möchten. Die Geschwindigkeit dieser Lösung hängt nur von der Anzahl der Elemente im ursprünglichen Array ab, während die Geschwindigkeit der Spleißlösung von der Anzahl der im Ausgabearray erforderlichen Elemente abhängt.
Wenn Sie nicht wiederholte zufällige Elemente möchten, können Sie Ihr Array mischen und dann nur so viele erhalten, wie Sie möchten:
DEMO: http://jsbin.com/UHUHuqi/1/edit
Shuffle-Funktion von hier übernommen: https://stackoverflow.com/a/6274398/1669279
quelle
O(n+k)
(n Elemente im Array, Sie möchten k davon), währendO(k)
dies möglich (und optimal) wäre.O(2n)
was reduziert werden könnte,O(n+k)
wenn Sie die Schleife in ändernwhile (counter-- > len-k)
und die letzten (anstelle der ersten)k
Elemente daraus entfernen würden. Insplice(i, 1)
der Tat nichtO(1)
, aber eineO(k)
Lösung ist immer noch möglich (siehe meine Antwort). Die Raumkomplexität bleibt jedoch erhaltenO(n+k)
leider erhalten, kann jedochO(2k)
von der Implementierung des spärlichen Arrays abhängen.Ich brauchte eine Funktion, um diese Art von Problem zu lösen, also teile ich sie hier.
Hinweis: Wenn Sie
n = arr.length
dann im Grunde genommen das Array mischenarr
undrandomItems
das gemischte Array zurückgeben.Demo
quelle
In dieser Antwort möchte ich Ihnen den Test mitteilen, dass ich die beste Methode kennen muss, mit der alle Elemente die gleiche Chance haben, ein zufälliges Subarray zu haben.
Methode 01
Bei dieser Methode haben einige Elemente im Vergleich zu anderen höhere Chancen.
Methode 2
Mit dieser Methode haben die Elemente die gleiche Wahrscheinlichkeit:
Die richtige Antwort finden Sie unter folgendem Link: https://stackoverflow.com/a/46545530/3811640
quelle
Es extrahiert zufällige Elemente nacheinander aus srcArray, solange es ausreicht, oder es sind keine weiteren Elemente in srcArray zum Extrahieren übrig. Schnell und zuverlässig.
quelle
2019
Dies entspricht der Antwort von Laurynas Mališauskas , nur dass die Elemente eindeutig sind (keine Duplikate).
Um nun die ursprüngliche Frage "Wie man mit jQuery mehrere zufällige Elemente erhält" zu beantworten, geht es los:
quelle
Hier ist eine Funktion, mit der Sie ein Array mit oder ohne Ersatz einfach abtasten können:
Die Verwendung ist einfach:
Ohne Ersatz (Standardverhalten)
randomSample([1, 2, 3], 2)
kann zurückkehren[2, 1]
Mit Ersatz
randomSample([1, 2, 3, 4, 5, 6], 4)
kann zurückkehren[2, 3, 3, 2]
quelle
quelle
Ich kann nicht glauben, dass niemand diese Methode nicht erwähnt hat, ziemlich sauber und direkt.
quelle
Hier ist eine optimierte Version des Code von Python von @Derek portierte, mit der zusätzlichen destruktiven (in-place) Option , die es den schnellste Algorithmus ermöglicht , wenn Sie mit ihm gehen. Andernfalls wird entweder eine vollständige Kopie erstellt oder für eine kleine Anzahl von Elementen, die von einem großen Array angefordert werden, auf einen auswahlbasierten Algorithmus umgeschaltet.
Im Vergleich zu Dereks Implementierung ist der erste Algorithmus in Firefox viel schneller und in Chrome etwas langsamer, obwohl er jetzt die destruktive Option hat - die leistungsstärkste. Der zweite Algorithmus ist einfach 5-15% schneller. Ich versuche, keine konkreten Zahlen anzugeben, da diese je nach k und n variieren und mit den neuen Browserversionen in Zukunft wahrscheinlich nichts mehr bedeuten werden.
Die Heuristik, die die Wahl zwischen Algorithmen trifft, stammt aus Python-Code. Ich habe es so belassen, wie es ist, obwohl es manchmal das langsamere auswählt. Es sollte für JS optimiert werden, ist jedoch eine komplexe Aufgabe, da die Leistung von Eckfällen browser- und versionabhängig ist. Wenn Sie beispielsweise versuchen, 20 von 1000 oder 1050 auszuwählen, wird entsprechend zum ersten oder zweiten Algorithmus gewechselt. In diesem Fall läuft der erste 2x schneller als der zweite in Chrome 80, aber 3x langsamer in Firefox 74.
quelle
Hier ist die richtigste Antwort und es gibt Ihnen zufällige + eindeutige Elemente.
quelle
items.sort (() => (Math.random ()> 0,5? 1: -1)). Slice (0, count);
quelle