我有一个表格,描述了我系统中的各种物体(即伞,靴子,书包,等等)。这些对象中的每一个都需要具有明显的患病率或发病率。例如,伞比靴子更罕见。基于这些因素,我需要根据该发生率值随机选择一个对象(包括空白或“找不到对象”)。
让人惊讶。有意义吗?
答案 0 :(得分:1)
SELECT * FROM some_table
WHERE (100*RAND()) > some_table.percent_probability
LIMIT 1
....并且选择的概率存储在percent_probability字段中。
下进行。
答案 1 :(得分:1)
如果你有一个write-seldom-read-many场景(即你很少更改对象和概率),你可能想要预先计算概率值,这样如果你有一个随机值,你可以明确地决定哪个要挑选的对象(使用单个选择,不进行排序,不需要对所有记录进行比较)。
E.g。 (每工厂的概率)
伞:500‰几率
靴子:250‰几率
书包:100‰几率
无论如何:100‰几率
“没什么”:50‰机会
0到499之间的随机数意味着“伞”被选中,500-749“靴子”等等。
INSERT INTO foo (name, randmin, randmax) VALUES
('umbrella', 0, 499),
('boots', 500, 749),
('satchel', 750, 849),
('whatever', 850, 949)
每次添加对象或修改概率都会重新创建此表。
然后您只需要一个像
这样的查询SELECT
f.name
FROM
(
SELECT Round(Rand()*1000) as r
) as tmp
JOIN
foo as f
ON
r BETWEEN f.randmin and f.randmax
LIMIT
1
只需要生成一个随机值,MySQL可以使用(randmin,randmax)索引快速查找记录。
答案 2 :(得分:0)
我要修改symcbean的答案,为symcbean修改+1。
SELECT * FROM some_table
WHERE (100*RAND()) < some_table.percent_probability
这将返回与您直观地分配给它们的概率相匹配的所有结果。例如,概率为20的5个对象将在20%的时间内返回。值为90的对象将在90%的时间内返回。
因此,您的结果将不止一个,但您可以保持罕见的对象不经常出现。所以现在只需随机抓取你的一个结果。一种简单的方法是将它们全部放在一个数组中:
$items = array(); // assuming you've already filled $items with your
// query results, one item for each array key
$count = count($items);
$chosen_key = rand(1,$count)-1;
$chosen_item = $items[$chosen_key];