3 Stimmen

Gewichteter Zufallspick aus einem Array in Ruby / Rails

Ich habe ein Modell in Rails, aus dem ich einen zufälligen Eintrag auswählen möchte. Bisher habe ich es mit einem benannten Bereich so gemacht:

named_scope :random,  lambda { { :order=>'RAND()', :limit => 1  } }

Jetzt habe ich jedoch ein Integer-Feld 'Gewicht' zum Modell hinzugefügt, das die Wahrscheinlichkeit darstellt, mit der jede Zeile ausgewählt werden soll.

Wie kann ich jetzt eine gewichtete Zufallsauswahl treffen?

Ich habe zwei Methoden auf snippets.dzone.com gefunden und ausprobiert, die die Array-Klasse erweitern und eine gewichtete Zufallsfunktion hinzufügen, aber beide haben nicht funktioniert oder zufällige Elemente für mich ausgewählt.

Ich benutze REE 1.8.7 und Rails 2.3.

1 Stimmen

Es könnte gut sein, anzugeben, welche DB Sie verwenden. Es ist nicht schwer in Ruby zu machen, aber es könnte in der DB viel effizienter sein.

0 Stimmen

Oh ja, ganz vergessen zu erwähnen, dass ich mysql benutzt habe. Aber ich war so darauf konzentriert, das in Ruby zu lösen, dass ich gar nicht daran gedacht habe, es auf der Abfrageebene zu lösen.

5voto

svoop Punkte 3194

Vielleicht verstehe ich das völlig falsch, aber könnten Sie nicht einfach die Spalte "Gewicht" als Faktor für die Zufallszahl verwenden? (Je nach Datenbank wären einige Vorkehrungen nötig, um ein Überlaufen des Produkts zu verhindern.)

named_scope :random,  lambda { { :order=>'RAND()*weight', :limit => 1  } }

0voto

rewritten Punkte 15944

In einer Abfrage sollten Sie:

  • das Gesamtgewicht berechnen
  • mit einem Zufallsfaktor multiplizieren, um eine Gewichtsschwelle zu erhalten
  • erneut durch die Tabelle scannen und addieren, bis die Gewichtsschwelle erreicht ist.

In SQL würde es etwa so aussehen (nicht echt ausprobiert)

SELECT SUM(weight) FROM table INTO @totalwt;
@lim := FLOOR(RAND() * @totalwt);
SELECT id, weight, @total := @total + weight AS cumulativeWeight
     FROM table WHERE cumulativeWeight < @lim, (SELECT @total:=0) AS t;

Inspiration von Optimal query to fetch a cumulative sum in MySQL

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X