具有加权概率的随机行选择
考虑一个包含 id、内容和权重等字段的表。您的目标是从该表中随机选择一行,同时考虑权重。
例如,给定包含以下数据的三行:
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;
这个方法保证了M的合理选择N 个元素的集合中的元素,其中选择每个元素的概率与其权重成正比。即使只需要单个元素,它仍然有效。
所提供的文章中详细描述了加权水库采样的基本原理。值得注意的是,它涉及选择 -LOG(RAND()) / 权重的最小值,而不是文章中所述的 POW(RAND(), 1/权重) 的最大值。这会产生相同的结果。
以上是如何使用SQL从加权表中随机选择一行?的详细内容。更多信息请关注PHP中文网其他相关文章!