Mysql
 sql >> Database >  >> RDS >> Mysql

selezionare un valore casuale in base alla probabilità

Puoi farlo usando rand() e quindi utilizzando una somma cumulativa. Supponendo che si sommino al 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;

Note:

  • rand() viene chiamato una volta in una sottoquery per inizializzare una variabile. Più chiamate a rand() non sono desiderabili.
  • C'è una remota possibilità che il numero casuale sia esattamente sul confine tra due valori. Il limit 1 sceglie arbitrariamente 1.
  • Questo potrebbe essere reso più efficiente interrompendo la sottoquery quando cumep > @r .
  • Non è necessario che i valori siano in un ordine particolare.
  • Questo può essere modificato per gestire le possibilità in cui la somma non è uguale a 1, ma questa sarebbe un'altra domanda.