Maison >base de données >tutoriel mysql >Comment puis-je sélectionner au hasard une ligne dans un tableau avec des probabilités pondérées ?

Comment puis-je sélectionner au hasard une ligne dans un tableau avec des probabilités pondérées ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-01 13:38:10604parcourir

How Can I Randomly Select a Row from a Table with Weighted Probabilities?

Sélection de lignes aléatoires avec probabilité pondérée

Problème :

Imaginez avoir une table avec des colonnes telles que « id », « contenu » et « poids ». Vous souhaitez sélectionner au hasard une ligne de ce tableau, en tenant compte de la valeur « poids ». Par exemple, s'il existe trois lignes :

id content weight
1 some content 60
2 other content 40
3 something 100

La première ligne a 30 % de chances d'être sélectionnée, la deuxième ligne a 20 % de chances et la troisième ligne a 50 % de chances.

Solution :

Une approche consiste à appliquer un réservoir pondéré échantillonnage :

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

Cette méthode permet de sélectionner un élément parmi de nombreux éléments avec des probabilités proportionnelles à leurs poids. Cela fonctionne efficacement pour sélectionner un seul élément.

La technique est détaillée dans cet article : [Weighted Reservoir Sampling](https://bit.ly/weighted-res-sampling). Notez que l'article sélectionne les plus grandes valeurs de POW(RAND(), 1/weight), ce qui équivaut à choisir les plus petites valeurs de -LOG(RAND()) /weight.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn