我有一个表格,如下所示:
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)可以工作,但它不是可伸缩的,我非常怀疑它是不是最有效的方式。有没有人能帮我一下?
先谢谢你,
发布于 2011-06-08 15:03:04
您首先需要在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);发布于 2011-06-08 14:54:16
我怀疑你是否需要更高效的工具。你想要扩展到什么?我会让它保持原样。干得好!
您可以用节点存储子元素的总数来组织树形结构中的元素。这将省去你对整个集合的迭代。但这是杀伤力太强了。
https://stackoverflow.com/questions/6275087
复制相似问题