6

各行に割り当てられた確率に基づいて、データベースからランダムな行を選択するにはどうすればよいですか。
例:

Make        Chance  Value
ALFA ROMEO  0.0024  20000
AUDI        0.0338  35000
BMW         0.0376  40000
CHEVROLET   0.0087  15000
CITROEN     0.016   15000
........

ランダムなメーカー名とその値を、選択する必要がある確率に基づいて選択するにはどうすればよいですか。

と の組み合わせは機能rand()ORDER BYますか? もしそうなら、これを行う最善の方法は何ですか?

4

1 に答える 1

8

これを行うrand()には、累積合計を使用してから使用します。合計が 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;

ノート:

  • rand()変数を初期化するためにサブクエリで 1 回呼び出されます。への複数回の呼び出しrand()は望ましくありません。
  • 乱数が正確に 2 つの値の境界上にある可能性はほとんどありません。はlimit 1任意に 1 を選択します。
  • のときにサブクエリを停止することで、これをより効率的にすることができますcumep > @r
  • 値は特定の順序である必要はありません。
  • これは、合計が 1 に等しくない可能性を処理するように変更できますが、それは別の問題です。
于 2015-11-07T22:32:13.137 に答える