これは、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に等しくない可能性を処理するように変更できますが、それは別の質問になります。