【问题标题】:How to generate random item with different frequency from mysql如何从mysql生成具有不同频率的随机项目
【发布时间】:2011-06-08 06:41:41
【问题描述】:

我有一张如下表:

Potion { id, name, freq }

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

我在想这样的事情:

  id | name  |   freq
  -------------------
   1 | light |     5
   2 | fire  |    10
   3 | water |    10
   4 | earth |    10
   5 | air   |     5

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

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)可以工作,但它不可扩展,我非常怀疑它是否是最有效的方法。有人可以帮我这样做吗?

提前谢谢你,

【问题讨论】:

  • 您已经成为会员 1 年 3 个月,问了 8 个问题,但从未接受过答案。

标签: mysql ruby random performance numbers


【解决方案1】:

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

create view constant_rand as select rand() as rand;

接下来选择一个由累积频率加权的随机行:

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);

【讨论】:

    【解决方案2】:

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

    您可以将元素组织成一个树形结构,其中的节点存储子节点的总数。这将节省您对整个集合的迭代。但这已经结束了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      • 2019-09-14
      • 2012-02-11
      相关资源
      最近更新 更多