Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wählen Sie einen zufälligen Wert basierend auf der Wahrscheinlichkeitswahrscheinlichkeit aus

Sie können dies tun, indem Sie rand() verwenden und dann mit einer kumulativen Summe. Angenommen, sie ergeben zusammen 100 %:

select t.*
from (select t.*, (@cumep := @cumep + chance) as cumep
      from t cross join
           (select @cumep := 0, @r := rand()) params
     ) t
where @r between cumep - chance and cumep
limit 1;

Hinweise:

  • rand() wird einmal in einer Unterabfrage aufgerufen, um eine Variable zu initialisieren. Mehrere Aufrufe von rand() sind nicht erwünscht.
  • Es besteht eine geringe Wahrscheinlichkeit, dass die Zufallszahl genau auf der Grenze zwischen zwei Werten liegt. Das limit 1 wählt willkürlich 1.
  • Dies könnte effizienter gemacht werden, indem die Unterabfrage gestoppt wird, wenn cumep > @r .
  • Die Werte müssen keine bestimmte Reihenfolge haben.
  • Dies kann geändert werden, um Chancen zu behandeln, bei denen die Summe nicht gleich 1 ist, aber das wäre eine andere Frage.