Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como selecionar uma linha aleatoriamente levando em consideração um peso?


Eu acho que o mais simples é realmente usar a amostragem ponderada do reservatório:
SELECT
  id,
  -LOG(RAND()) / weight AS priority
FROM
  your_table
ORDER BY priority
LIMIT 1;

É um ótimo método que permite escolher M de N elementos onde a probabilidade de ser escolhido para cada elemento é proporcional ao seu peso. Funciona tão bem quando você quer apenas um elemento. O método é descrito em este artigo . Observe que eles escolhem os maiores valores de POW(RAND(), 1/peso), o que equivale a escolher os menores valores de -LOG(RAND())/peso.