Es gibt einen einfachen Algorithmus zum zufälligen Auswählen eines Artikels, bei dem Artikel individuelle Gewichte haben:
1) Berechnen Sie die Summe aller Gewichte
2) Wählen Sie eine Zufallszahl, die 0 oder größer ist und kleiner als die Summe der Gewichte ist
3) Gehen Sie die Artikel einzeln durch und subtrahieren Sie ihr Gewicht von Ihrer Zufallszahl, bis Sie den Artikel erhalten, bei dem die Zufallszahl geringer ist als das Gewicht dieses Artikels
Pseudocode zur Veranschaulichung:
int sum_of_weight = 0;
for(int i=0; i<num_choices; i++) {
sum_of_weight += choice_weight[i];
}
int rnd = random(sum_of_weight);
for(int i=0; i<num_choices; i++) {
if(rnd < choice_weight[i])
return i;
rnd -= choice_weight[i];
}
assert(!"should never get here");
Dies sollte einfach an Ihre Boost-Container und dergleichen anzupassen sein.
Wenn Ihre Gewichte selten geändert werden, Sie jedoch häufig zufällig eine auswählen und Ihr Container Zeiger auf die Objekte speichert oder mehr als ein paar Dutzend Elemente lang ist (im Grunde müssen Sie ein Profil erstellen, um zu wissen, ob dies hilft oder behindert). , dann gibt es eine Optimierung:
Durch Speichern der kumulierten Gewichtssumme in jedem Artikel können Sie mithilfe einer binären Suche den Artikel auswählen, der dem Kommissioniergewicht entspricht.
Wenn Sie die Anzahl der Elemente in der Liste nicht kennen, gibt es einen sehr übersichtlichen Algorithmus namens Reservoir Sampling , der zur Gewichtung angepasst werden kann.