Sélection de lignes aléatoires avec probabilité pondérée
Considérez un tableau avec des champs tels que l'identifiant, le contenu et le poids. Votre objectif est de sélectionner au hasard une seule ligne de ce tableau tout en prenant en compte les poids.
Par exemple, étant donné trois lignes avec les données suivantes :
id, content, weight 1, "some content", 60 2, "other content", 40 3, "something", 100
La distribution de probabilité est la suivante :
Échantillonnage pondéré des réservoirs
L'approche la plus simple pour y parvenir consiste à procéder à un échantillonnage pondéré des réservoirs :
SELECT id, -LOG(RAND()) / weight AS priority FROM your_table ORDER BY priority LIMIT 1;
Cette méthode garantit une sélection raisonnable de M éléments parmi une collection de N éléments, où les la probabilité de sélectionner chaque élément est proportionnelle à son poids. Il reste efficace même lorsqu'un seul élément est souhaité.
Le principe sous-jacent de l'échantillonnage pondéré des réservoirs est décrit en détail dans l'article fourni. Notamment, cela implique de sélectionner les plus petites valeurs de -LOG(RAND()) /weight plutôt que les plus grandes valeurs de POW(RAND(), 1/weight) comme décrit dans l'article. Cela donne des résultats équivalents.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!