java中SQL表中的概率随机项

java中SQL表中的概率随机项,java,mysql,sql,Java,Mysql,Sql,我正试图找出如何从如下值表中选择一个随机项目,它有自己给定的机会: 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,

我正试图找出如何从如下值表中选择一个随机项目,它有自己给定的机会:

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,什么会给玩家一个随机彩票项目的基础上的机会

编辑: 你必须得到一个项目,你不能得到多个项目。
概率越高,获得该项目的可能性越大。

您可以在MySQL中使用rand和累积总和来实现这一点:

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应包含机会的总和。另一种方法是使用子查询显式地计算它。

在此数据集中,概率值越大,找到该对象的几率就越大,还是相反?有可能得到零个或多个对象吗?我用更正编辑了我的原始帖子@SimonBerthiaume@Forgets . . . 你的机会太大了,你不妨一直选择最后一个。@GordonLinoff这只是我发布的一个简短的一瞥,原来的sql有超过100个机会项。我刚刚包括了最高值189k和最低值89。这是java语言吗?它看起来像一个sql脚本。我希望做一个函数来获取物品id的机会,并给出物品randomly@Forgets . . . 您的问题被标记为SQL。我不知道你想要java的解决方案。答案是一样的。累积机会,然后使用随机数生成器。除非数据库的带宽非常慢,否则性能应该非常相似。是的,对不起,我是新手,我还标记了java。我应该只在java标记中重新发布吗?