首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从mysql中生成不同频率的随机项目

如何从mysql中生成不同频率的随机项目
EN

Stack Overflow用户
提问于 2011-06-08 14:41:41
回答 2查看 278关注 0票数 0

我有一个表格,如下所示:

代码语言:javascript
复制
Potion { id, name, freq }

我以“随机”的方式向用户分发药水。但我希望能够控制随机性的频率,因为一些药水比其他药水更强大。做这件事最好的方法是什么?

我在想这样的事情:

代码语言:javascript
复制
  id | name  |   freq
  -------------------
   1 | light |     5
   2 | fire  |    10
   3 | water |    10
   4 | earth |    10
   5 | air   |     5

光和空气比火、水和土更强大,所以它们的频率更小。

代码语言:javascript
复制
sum = select sum(*) from potions;
x = random(1..sum)
table = select * from potions;
offset = 0
for each element in table
  if offset + element[freq] > x
     chosen = element[name]
  end
  offset += element[freq]
end

我认为上面的代码(ruby + sql)可以工作,但它不是可伸缩的,我非常怀疑它是不是最有效的方式。有没有人能帮我一下?

先谢谢你,

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-08 15:03:04

您首先需要在RAND()之上创建一个视图,以便在执行期间为每次调用返回相同的值(否则您将得到奇怪的结果):

代码语言:javascript
复制
create view constant_rand as select rand() as rand;

接下来,选择按累积频率加权的随机行:

代码语言:javascript
复制
select id
from potion p1
join constant_rand
where rand * (select sum(freq) from potion) between
    -- sum of freq below this row
    ifnull((select sum(freq) from potion p2 where p2.id < p1.id), 0)
    -- sum of freq below and including this row
    and (select sum(freq) from potion p2 where p2.id <= p1.id);
票数 0
EN

Stack Overflow用户

发布于 2011-06-08 14:54:16

我怀疑你是否需要更高效的工具。你想要扩展到什么?我会让它保持原样。干得好!

您可以用节点存储子元素的总数来组织树形结构中的元素。这将省去你对整个集合的迭代。但这是杀伤力太强了。

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

https://stackoverflow.com/questions/6275087

复制
相关文章

相似问题

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