【问题标题】:Random item with probability from SQL table in javajava中SQL表中具有概率的随机项
【发布时间】:2018-02-17 15:19:39
【问题描述】:

我试图弄清楚如何从这样的值表中选择一个具有自己给定机会的随机项目:

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,它会根据机会给玩家一个随机的彩票项目。

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

【问题讨论】:

  • 在这个数据集中,机会值越大,找到该对象的几率就越大,还是相反?是否可以获得零个或多个对象?
  • 我用@SimonBerthiaume 的更正编辑了我的原始帖子
  • @Forgets 。 . .您的机会如此不成比例,您不妨一直选择最后一个。
  • @GordonLinoff 这只是我发布的一个简短的一瞥,原来的 sql 有超过 100 个项目有机会。我只包括了最高值 189k 和最低值 89。

标签: java mysql sql


【解决方案1】:

您可以在 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 应该包含chance 的总和。另一种方法是使用子查询显式计算它。

【讨论】:

  • 那是在java中吗?它看起来像一个 sql 脚本。我希望创建一个函数来获取项目 ID 的机会并随机提供项目
  • @Forgets 。 . .您的问题被标记为 SQL。我没有意识到你想要java中的解决方案。解决方法是一样的。 . .累积机会,然后使用随机数生成器。除非您的数据库带宽非常慢,否则性能应该非常相似。
  • 是的,对不起,我是新手,我还标记了 java。我应该只在 java 标签中重新发布吗?
猜你喜欢
  • 2013-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-19
  • 2015-06-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多