首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MySQL中随机挑选具有一定概率(权重)的行

在MySQL中随机挑选具有一定概率(权重)的行
EN

Stack Overflow用户
提问于 2014-03-21 00:18:57
回答 2查看 832关注 0票数 3

我在这里搜索了一段时间,但结果让我感到困惑,因为我是MySQL的新手。

我有一个包含以下4列的表:AUTO_INCREMENT ID, NAME, TYPE, CHANCE,所以行看起来像这样:

代码语言:javascript
复制
1, NOTHING, NO, 35
1, VERSICOLOR, TREE, 35
3, DIVERSIPES, TREE, 35
4, AMAZONICA, TREE, 35
5, EMILIA, GROUND, 25
6, BOEHMI, GROUND, 25
7, SMITHI, GROUND, 25
8, METALLICA, SKY, 5
9, REGALIS, SKY, 5

注意:这些都是简单的例子,将会有类似的x100。我需要做的是从该表中选择一行,其中包含CHANCE列中显示的机会。

我需要从其中的9个中选择一行,结果可以是"VERSICOLOR,DIVERSIPES,AMAZONICA或NOTHING与35%的机会“或”艾米莉亚,BOEHMI或史密斯与25%的机会“或”金属或帝王与%5的机会“。因此,这个查询可能会给出"VERSICOLOR,DIVERSIPES,AMAZONICA or NOTHING“的结果,因为它有35%的机会,或者我很幸运,我会得到"METALLICA or REGALIS”:)

基本上有3组类型,地面,树和天空。我想要做的是从所有这些中只得到一个结果。地面,树或天空类型的项目有一定的机会,但可以肯定的是,我不想为每个组一个,我只想要一个结果,它可以是地面,树或天空类型的项目。我希望我已经解释清楚了。致以问候。

EN

回答 2

Stack Overflow用户

发布于 2014-03-21 00:39:22

可能有一个更优雅的解决方案,它不会假设你的百分比加到100 --但这可能是可行的:

示例http://sqlfiddle.com/#!2/ec699/1

代码语言:javascript
复制
SELECT *
FROM (
  SELECT id, name, type, chance
    , @value + 1 AS lowval
    , @value := @value + chance AS hival
  FROM tbl
  JOIN (SELECT @value := 0) AS foo) AS bar
JOIN (SELECT FLOOR(1 + RAND()*99) AS guesser) AS bar2
  ON guesser  BETWEEN lowval and hival;
票数 0
EN

Stack Overflow用户

发布于 2014-03-21 02:26:12

这个问题出现在SQL之外。我在这里发布了一个通用的解决方案,generate random numbers within a range with different probabilities

用你使用的第一组数字(70%,25%,5%)填满三个骨灰盒,每个罐子里有100个球。所有的球都是红色的。其中75个球是绿色的25个球是红色的。最后,骨灰盒2将有15个蓝球和85个红球。现在随机挑选一个骨灰盒,每个骨灰盒的概率为1/3,然后随机挑选一个球。使用该方案,获得红球的概率为0.75,获得绿球的概率为0.25,获得蓝球的概率为0.05。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22539031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档