Heim  >  Artikel  >  Web-Frontend  >  Wie kann ich effizient und ohne Wiederholung zufällige Elemente aus einem Array auswählen, insbesondere wenn das Array ständig geändert wird?

Wie kann ich effizient und ohne Wiederholung zufällige Elemente aus einem Array auswählen, insbesondere wenn das Array ständig geändert wird?

Susan Sarandon
Susan SarandonOriginal
2024-11-01 17:16:02493Durchsuche

How can I efficiently select random items from an array without repetition, especially when the array is constantly being modified?

Effiziente Zufallsauswahl aus einem Array

Einführung

Die zufällige Auswahl eines Elements aus einem Array ohne Wiederholung ist eine gängige Programmierung Aufgabe. Wenn sich der Artikelpool jedoch ständig ändert, ist die Sicherstellung der Effizienz von entscheidender Bedeutung.

Frage

Ein Entwickler hat eine Funktion implementiert, um ein Element zufällig aus einem Array auszuwählen Dabei wird eine Liste der zuletzt getroffenen Entscheidungen geführt, um Wiederholungen zu vermeiden. Sie äußern jedoch Bedenken hinsichtlich der Effizienz und erkundigen sich, ob es einen optimaleren Ansatz gibt.

Antwort

1. Erläuterung der Rekursion

Der bereitgestellte Code scheint tatsächlich eine rekursive Funktion zu sein. Bei der Rekursion ruft sich eine Funktion selbst auf, was in bestimmten Szenarien zu Ineffizienzen führen kann.

2. Effizienzverbesserung

Um die Effizienz zu verbessern, ziehen Sie den folgenden alternativen Ansatz in Betracht:

  1. Erstellen Sie eine Kopie des ursprünglichen Arrays. Dadurch wird sichergestellt, dass das ursprüngliche Array erhalten bleibt bleibt intakt.
  2. Definieren Sie eine Funktion, die zufällig ein Element aus der Kopie auswählt.
  3. Wenn die Kopie aufgebraucht ist, setzen Sie sie zurück, indem Sie eine neue Kopie erstellen das ursprüngliche Array.

Code-Implementierung:

<code class="javascript">function randomNoRepeats(array) {
  var copy = array.slice(0);
  return function() {
    if (copy.length < 1) {
      copy = array.slice(0);
    }
    var index = Math.floor(Math.random() * copy.length);
    var item = copy[index];
    copy.splice(index, 1);
    return item;
  };
}

var chooser = randomNoRepeats(['Foo', 'Bar', 'Gah']);</code>

Erklärung:

Dieser Ansatz Isoliert die Zufallsauswahllogik vom Code, der für die Verwaltung des Arrays der letzten Auswahlmöglichkeiten verantwortlich ist. Dadurch wird die Effizienz verbessert, da die zufällige Auswahl nur einmal pro Ausführung der Auswahlfunktion erfolgt.

Durch das Zurücksetzen der Kopie, wenn sie aufgebraucht ist, garantiert die Funktion, dass alle Elemente die gleiche Chance haben, ausgewählt zu werden. Dadurch wird das potenzielle Problem beseitigt, dass der Code in einer Endlosschleife stecken bleibt und versucht, einen „eindeutigen“ Namen zu finden.

Das obige ist der detaillierte Inhalt vonWie kann ich effizient und ohne Wiederholung zufällige Elemente aus einem Array auswählen, insbesondere wenn das Array ständig geändert wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn