【问题标题】:How can I assign weights based on item importance dynamically?如何根据项目重要性动态分配权重?
【发布时间】:2014-09-27 13:39:30
【问题描述】:

我正在尝试找出一种方法,我可以使用它来构建一个系统,该系统将根据该项目的重要性为表中的独立对象分配权重以进行随机加权排序。例如,如果比例为 0-9。如果您分配了四个项目 3、5、9、1,那么系统将能够对这些数字进行排序,并构建列表,以便每个重量在四个对象之间总计为 1。您将如何对这些项目进行分类?

目前,这就是我所拥有的 SQL:

CREATE TABLE IF NOT EXISTS `block_types` (
    `ID` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
    `BlockTypeUID` varchar(35),
    `Name` varchar(20),
    `Weight` float,
    `Turns` int(11),
    `Score` int(11),
    `Hitpoints` int(20),
    `Rarity` int(11),
    `Multiplier` int(1),
    `Effect` int(11),
    `Area` int(11),
    PRIMARY KEY (`ID`)
) DEFAULT COLLATE=utf8_general_ci;

权重是一个从 0.0001 到 1 的浮点数,目前我基本上是通过一个简单的输入表单手动分配它。这个想法是 Rarity 将处理存储 0-9,并用于根据所有其他条目自动计算新的权重 - 以便表格的总和等于 1。

【问题讨论】:

  • 从数据库返回值时不能只使用ORDER BY Weight (asc|desc) 吗?您从数据库返回的对象是否需要某种相对值,这就是为什么您希望表的总和为 1?

标签: php sorting weighted


【解决方案1】:

编辑:我阅读了您问题的底部。

这个略显凌乱的查询会使表中的所有权重字段根据稀有度按比例加起来为 1。 (可能更像 .9999999998)

UPDATE block_types SET Weight=Rarity/(SELECT SUM(Rarity) AS r FROM (SELECT Rarity FROM block_types) AS bt);

例如,如果有两行,一排的稀有度为 40,另一排的稀有度为 80,那么您最终会得到 0.3333 和 0.6666 的重量(40 是总数 120 的 1/3,80 是 2 /3)。

希望对您有所帮助。

【讨论】:

  • Float 是我在 C# 中所做的,尽管使用的是对象数组而不是 mySQLi 数据库。稀有度等于 0-9,当产品可能为 0.00000 时,您建议使用什么来存储计算的重量?
  • @Merlin 我的意思是,当您处理不规则比例时,它实际上不会加起来为 1(例如我给出的 40 和 80 变为 .3333 和 .6666 的示例)。因此,只需确保您的应用程序编码不依赖于总数正好为 1。
  • 谢谢!只是想知道最好的数据类型是什么,我暂时切换到十进制尝试。
  • @Merlin 如果我的回答有帮助,请考虑接受:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-04
相关资源
最近更新 更多