Mysql
 sql >> Base de données >  >> RDS >> Mysql

sélectionner une valeur aléatoire en fonction de la chance de probabilité

Vous pouvez le faire en utilisant rand() puis en utilisant une somme cumulée. En supposant qu'ils totalisent 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;

Remarques :

  • rand() est appelée une fois dans une sous-requête pour initialiser une variable. Plusieurs appels à rand() ne sont pas souhaitables.
  • Il y a une faible chance que le nombre aléatoire soit exactement à la frontière entre deux valeurs. La limit 1 choisit arbitrairement 1.
  • Cela pourrait être rendu plus efficace en arrêtant la sous-requête lorsque cumep > @r .
  • Les valeurs ne doivent pas nécessairement être dans un ordre particulier.
  • Cela peut être modifié pour gérer les chances où la somme n'est pas égale à 1, mais ce serait une autre question.