Gewichtetes Zufallsausprobieren in JavaScript

JavaScriptJavaScriptBeginner
Jetzt üben

This tutorial is from open-source community. Access the source code

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab werden wir eine praktische Implementierung einer gewichteten Stichprobe-Funktion in JavaScript untersuchen. Die Funktion gibt ein zufälliges Element aus einem Array zurück, wobei jedem Element Gewichte zugewiesen werden, basierend auf den bereitgestellten Werten. Durch dieses Lab werden wir lernen, wie Array-Methoden wie reduce() und findIndex() zusammen mit Math.random() verwendet werden, um das gewünschte Ergebnis zu generieren.

Wie man eine gewichtete Stichprobe aus einem Array in JavaScript bekommt

Um zufällig ein Element aus einem Array basierend auf den bereitgestellten Gewichten zu erhalten, folgen Sie diesen Schritten:

  1. Öffnen Sie das Terminal/SSH und geben Sie node ein, um mit der Codeausführung zu beginnen.
  2. Verwenden Sie Array.prototype.reduce(), um ein Array von Teilsummen für jedes Element in weights zu erstellen.
  3. Verwenden Sie Math.random(), um eine Zufallszahl zu generieren, und Array.prototype.findIndex(), um den richtigen Index basierend auf dem zuvor erzeugten Array zu finden.
  4. Geben Sie schließlich das Element von arr mit dem erzeugten Index zurück.

Hier ist der Code, um dies zu erreichen:

const weightedSample = (arr, weights) => {
  let roll = Math.random();
  return arr[
    weights
      .reduce(
        (acc, w, i) => (i === 0 ? [w] : [...acc, acc[acc.length - 1] + w]),
        []
      )
      .findIndex((v, i, s) => roll >= (i === 0 ? 0 : s[i - 1]) && roll < v)
  ];
};

Sie können diese Funktion testen, indem Sie ein Array und seine entsprechenden Gewichte als Argumente übergeben:

weightedSample([3, 7, 9, 11], [0.1, 0.2, 0.6, 0.1]); // 9

Zusammenfassung

Herzlichen Glückwunsch! Sie haben das Gewichtete Stichprobe-Lab abgeschlossen. Sie können in LabEx weitere Labs absolvieren, um Ihre Fähigkeiten zu verbessern.