sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo seleccionar una fila al azar teniendo en cuenta un peso?

Creo que lo más simple es usar el muestreo de depósito ponderado:

SELECT
  id,
  -LOG(RAND()) / weight AS priority
FROM
  your_table
ORDER BY priority
LIMIT 1;

Es un gran método que te permite elegir M de N elementos donde la probabilidad de ser elegido para cada elemento es proporcional a su peso. Funciona igual de bien cuando solo desea un elemento. El método se describe en este artículo . Tenga en cuenta que eligen los valores más grandes de POW(ALEATORIO(), 1/peso), lo que equivale a elegir los valores más pequeños de -LOG(ALEATORIO())/peso.