Zufällige Zeilenauswahl mit gewichteter Wahrscheinlichkeit
Stellen Sie sich eine Tabelle mit Feldern wie ID, Inhalt und Gewicht vor. Ihr Ziel ist es, zufällig eine einzelne Zeile aus dieser Tabelle auszuwählen und dabei die Gewichtungen zu berücksichtigen.
Zum Beispiel drei Zeilen mit den folgenden Daten:
id, content, weight 1, "some content", 60 2, "other content", 40 3, "something", 100
Die Wahrscheinlichkeitsverteilung ist wie folgt :
Gewichtete Reservoirprobenahme
Der einfachste Ansatz, dies zu erreichen, ist die gewichtete Reservoirprobenahme:
SELECT id, -LOG(RAND()) / weight AS priority FROM your_table ORDER BY priority LIMIT 1;
Diese Methode garantiert eine sinnvolle Auswahl von M Elementen aus einer Sammlung von N Elementen, wobei die Wahrscheinlichkeit Die Auswahl jedes Elements ist proportional zu seinem Gewicht. Es bleibt auch dann wirksam, wenn nur ein einzelnes Element gewünscht wird.
Das Grundprinzip der gewichteten Reservoirprobenahme wird im bereitgestellten Artikel ausführlich beschrieben. Insbesondere geht es darum, die kleinsten Werte von -LOG(RAND())/Gewicht auszuwählen und nicht die größten Werte von POW(RAND(), 1/Gewicht), wie im Artikel dargestellt. Dies führt zu gleichwertigen Ergebnissen.
Das obige ist der detaillierte Inhalt vonWie kann ich mit SQL zufällig eine Zeile aus einer gewichteten Tabelle auswählen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!