Heim >Backend-Entwicklung >C++ >Wie kann ich mit der Boost-Bibliothek gewichtete Zufallszahlen generieren?
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:
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!