Problem:
Stellen Sie sich vor, Sie hätten eine Tabelle mit Spalten wie „id“, „Inhalt“ und „Gewicht“. Sie möchten unter Berücksichtigung des „Gewichtungswerts“ zufällig eine Zeile aus dieser Tabelle auswählen. Wenn zum Beispiel drei Zeilen vorhanden sind:
id | content | weight |
---|---|---|
1 | some content | 60 |
2 | other content | 40 |
3 | something | 100 |
Die erste Zeile hat eine Auswahlwahrscheinlichkeit von 30 %, die zweite Zeile hat eine 20 %-Chance und die dritte Zeile hat eine 50 %-Chance.
Lösung:
Ein Ansatz besteht darin, ein gewichtetes Reservoir anzuwenden Stichprobenziehung:
SELECT id, -LOG(RAND()) / weight AS priority FROM your_table ORDER BY priority LIMIT 1;
Mit dieser Methode können Sie eines aus vielen Elementen auswählen, dessen Wahrscheinlichkeiten proportional zu ihren Gewichten sind. Es eignet sich effektiv für die Auswahl eines einzelnen Elements.
Die Technik wird in diesem Artikel näher erläutert: [Gewichtete Reservoirprobenahme](https://bit.ly/weighted-res-sampling). Beachten Sie, dass der Artikel die größten Werte von POW(RAND(), 1/Gewicht) auswählt, was der Auswahl der kleinsten Werte von -LOG(RAND())/Gewicht entspricht.
Das obige ist der detaillierte Inhalt vonWie kann ich zufällig eine Zeile aus einer Tabelle mit gewichteten Wahrscheinlichkeiten auswählen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!