重み付き確率によるランダムな行選択
ID、コンテンツ、重みなどのフィールドを含むテーブルについて考えます。目標は、重みを考慮しながらこのテーブルから 1 つの行をランダムに選択することです。
たとえば、次のデータを持つ 3 つの行があるとします。
id, content, weight 1, "some content", 60 2, "other content", 40 3, "something", 100
確率分布は次のとおりです。 :
加重リザーバー サンプリング
これを達成するための最も簡単なアプローチは、加重リザーバー サンプリングを使用することです。
SELECT id, -LOG(RAND()) / weight AS priority FROM your_table ORDER BY priority LIMIT 1;
このメソッドは合理的な選択を保証しますN 個の要素のコレクションから M 個の要素を抽出します。各要素が選択される確率はその重みに比例します。単一の元素のみが必要な場合でも、有効なままです。
加重貯留層サンプリングの基本原理については、提供されている記事で詳しく説明されています。特に、この記事で説明されているように、POW(RAND(), 1/weight) の最大値ではなく、-LOG(RAND()) /weight の最小値を選択する必要があります。これにより、同等の結果が得られます。
以上がSQL を使用して加重テーブルから行をランダムに選択するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。