Heim >Backend-Entwicklung >C++ >Wie kann ich mit der Boost-Bibliothek gewichtete Zufallszahlen generieren?

Wie kann ich mit der Boost-Bibliothek gewichtete Zufallszahlen generieren?

Barbara Streisand
Barbara StreisandOriginal
2024-12-20 20:14:10848Durchsuche

How Can I Generate Weighted Random Numbers Using the Boost Library?

Gewichtete Zufallszahlen in Boost

Die Boost-Bibliothek bietet umfangreiche Funktionen zur Zufallszahlengenerierung. Es bietet zwar eine einfache Generierung von Zufallszahlen, es fehlt jedoch die integrierte Unterstützung für gewichtete Zufallszahlen. In diesem Artikel werden Techniken zur Implementierung einer gewichteten Zufallszahlenauswahl mithilfe roher Boost-Funktionen untersucht.

Gewichteter Randomisierungsalgorithmus

Um eine gewichtete Zufallszahl zu generieren, können wir den folgenden Algorithmus verwenden:

  1. Berechnen Sie die Summe aller Gewichte.
  2. Generieren Sie eine Zufallszahl dazwischen 0 und die Summe der Gewichte (einschließlich).
  3. Subtrahieren Sie die Gewichte iterativ von der Zufallszahl, bis sie negativ wird. Der Index des aktuellen Elements ist die ausgewählte gewichtete Zahl.

Anpassung an Boost

Dieser Algorithmus kann wie folgt an Boost angepasst werden:

using namespace boost;

int weightedRandom(const std::vector<int>& weights) {
  // Calculate the sum of weights
  int sum = accumulate(weights.begin(), weights.end(), 0);

  // Generate a random number between 0 and the sum
  variate_generator<mt19937, uniform_int_distribution<int>> rand(generator());
  int rnd = rand(sum);

  // Traverse weights and subtract until random number becomes negative
  for (size_t i = 0; i < weights.size(); ++i) {
    if (rnd - weights[i] < 0) {
      return i;
    }
    rnd -= weights[i];
  }

  // Should never reach here
  assert(false);
}

Optimierung für gleichbleibende Gewichte

Wenn Gewichte selten geändert werden und die Liste einigermaßen lang ist, können wir optimieren, indem wir kumulative Gewichtssummen vorab berechnen und die binäre Suche verwenden.

Reservoir-Stichprobe für unbekannte Listengröße

Für Listen mit unbekannter Größe, Die Probenentnahme aus dem Reservoir kann gewichtet erfolgen Anpassungen.

Fazit

Während Boost keine dedizierte gewichtete Zufallszahlenfunktion hat, ermöglichen die vorgestellten Techniken eine effiziente und genaue Generierung mit rohen Boost-Funktionen.

Das obige ist der detaillierte Inhalt vonWie kann ich mit der Boost-Bibliothek gewichtete Zufallszahlen generieren?. 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