从表中选择一个随机行,但是有赔率?

时间:2010-03-30 21:00:36

标签: php mysql codeigniter

我有一个表格,描述了我系统中的各种物体(即伞,靴子,书包,等等)。这些对象中的每一个都需要具有明显的患病率或发病率。例如,伞比靴子更罕见。基于这些因素,我需要根据该发生率值随机选择一个对象(包括空白或“找不到对象”)。

让人惊讶。有意义吗?

3 个答案:

答案 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];