select random value based on probability chance

前端 未结 1 1594
星月不相逢
星月不相逢 2021-01-05 22:35

How do I select a random row from the database based on the probability chance assigned to each row.
Example:

Make        Chance  Value
ALFA ROM         


        
相关标签:
1条回答
  • 2021-01-05 23:22

    You can do this by using rand() and then using a cumulative sum. Assuming they add up to 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;
    

    Notes:

    • rand() is called once in a subquery to initialize a variable. Multiple calls to rand() are not desirable.
    • There is a remote chance that the random number will be exactly on the boundary between two values. The limit 1 arbitrarily chooses 1.
    • This could be made more efficient by stopping the subquery when cumep > @r.
    • The values do not have to be in any particular order.
    • This can be modified to handle chances where the sum is not equal to 1, but that would be another question.
    0 讨论(0)
提交回复
热议问题