首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java中SQL表中具有概率的随机项

问java中SQL表中具有概率的随机项
EN

Stack Overflow用户
提问于 2018-02-17 23:19:39
回答 1查看 55关注 0票数 0

我正在尝试弄清楚如何从一个值表中选择一个具有自己给定机会的随机项目,如下所示:

代码语言:javascript
复制
itemlottery (npcid, item, chance) VALUES (9100100, 1402011, 167)
itemlottery (npcid, item, chance) VALUES (9100100, 1041082, 267)
itemlottery (npcid, item, chance) VALUES (9100100, 1322003, 1668)
itemlottery (npcid, item, chance) VALUES (9100100, 1061033, 89)
itemlottery (npcid, item, chance) VALUES (9100100, 1051001, 89)
itemlottery (npcid, item, chance) VALUES (9100100, 2000005, 188983)

所以基本上我可以从SQL得到物品和机会,但是用java硬编码会不会更好呢?

无论如何,这些都是我需要的值(列表实际上包含的不仅仅是50+项)。

现在我的问题是,我如何读取这些值,然后在Java中根据这些概率生成一个随机项目?

这是为一个游戏的NPC,这将给玩家一个随机抽奖项目基于机会。

编辑:您必须获得一个项目,而不能获得多个项目。机会越高,获得该物品的可能性就越大。

EN

回答 1

Stack Overflow用户

发布于 2018-02-18 00:39:41

您可以在MySQL中使用rand()和累积和来完成此操作:

代码语言:javascript
复制
select t.*
from (select t.*, (@sum := @sum + chance) as cume_chance
      from t cross join
           (select @sum := 0, @r := rand()) params
     ) t 
where @r < cume_chance / @sum and
      @r >= (cume_chance - chance) / @sum;

将rand()计算为变量的原因是,该函数只计算一次。运行外部where时,@sum应包含chance的总和。另一种方法是使用子查询显式计算它。

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

https://stackoverflow.com/questions/48842798

复制
相关文章

相似问题

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