Heim > Web-Frontend > js-Tutorial > Wie kann die Generierung gewichteter Zufallszahlen effizienter gestaltet werden?

Wie kann die Generierung gewichteter Zufallszahlen effizienter gestaltet werden?

DDD
Freigeben: 2024-11-14 11:56:02
Original
495 Leute haben es durchsucht

How Can Weighted Random Number Generation Be Optimized for Efficiency?

Gewichtete Zufallszahlen generieren

Bei der gewichteten Zufallszahlengenerierung wird eine Zufallszahl aus einem Bereich ausgewählt, in dem die Wahrscheinlichkeit jeder Zahl durch a bestimmt wird Gewicht. Diese Aufgabe stellt sich in verschiedenen Anwendungen wie Simulationen und Spielen.

Erste Lösung

Ein gängiger Ansatz ist die Ausschlussstichprobe, wie im Beispiel dargestellt bereitgestellter ColdFusion-Code. Bei dieser Methode wird eine Nachschlagetabelle mit Elementen erstellt, die entsprechend ihrer Gewichtung verteilt sind. Dieser Ansatz weist jedoch Einschränkungen auf, wie z. B. den linearen Mehraufwand beim Erstellen der Tabelle und potenzielle Speicherverbrauchsprobleme.

Alternative Strategien

  • Lineare Summierung: Eine andere Strategie besteht darin, die Gewichte iterativ zu summieren, bis die Summe eine zufällig generierte Zahl im Bereich [0,1) überschreitet. Anschließend wird der zugehörige Wert zurückgegeben. Dieser Ansatz hat keine Vorabkosten, sondern eine lineare Zeitkomplexität.
  • Reservoir-Stichprobe: Bei dieser Methode wird eine Zufallsstichprobe aus einem Strom von Elementen ausgewählt. Wenn jedes Element angetroffen wird, wird es dem Reservoir mit einer Wahrscheinlichkeit hinzugefügt, die proportional zu seinem Gewicht ist. Die Reservoirgröße bleibt fest und gewährleistet eine konstante Zeitkomplexität.
  • Alias-Stichprobe: Diese Technik verwendet eine vorberechnete Tabelle, um Zufallszahlen aus einer gewichteten Verteilung auszuwählen. Es garantiert eine konstante Zeitkomplexität und ist im Allgemeinen effizienter als die anderen Ansätze für große oder stark verzerrte Gewichtsverteilungen.

Implementierung

Eine Implementierung von gewichtetem Zufall Zahlengenerierung in JavaScript mittels Alias-Sampling:

function weightedRand(weights) {
  // Build the alias table
  let table = [];
  let totalWeight = 0;
  for (let i = 0; i < weights.length; i++) {
    totalWeight += weights[i];
  }
  for (let i = 0; i < weights.length; i++) {
    let prob = weights[i] / totalWeight;
    let alias = i;
    table.push({ prob: prob, alias: alias });
  }
  
  // Generate a random number
  return function() {
    let r = Math.random() * totalWeight;
    let i = 0;
    let alias = -1;
    while (i < table.length && alias === -1) {
      if (r < table[i].prob) {
        alias = i;
      } else {
        r -= table[i].prob;
        i = table[i].alias;
      }
    }
    return alias;
  }
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie kann die Generierung gewichteter Zufallszahlen effizienter gestaltet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage