2014-09-27 142 views
1

我想弄清楚一种方法,我可以用它来建立一个系统,将权重分配给表中的独立对象进行随机加权排序 - 基于该项目的重要性。例如,如果一个比例是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.

+0

从数据库返回值时不能使用'ORDER BY Weight(asc | desc)'?你从数据库返回的对象是否需要某种相对值,这就是为什么你希望表的总和为1的原因? – 2014-09-27 13:55:49

回答

0

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

这个稍微凌乱的查询会使您表格中的所有权重字段根据稀缺度成比例地加1。 (它可能会更喜欢0.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是总数的1/3,80是2/3)。

希望有所帮助。

+0

虽然使用对象数组而不是mySQLi数据库,但是我已经在C#中完成了这种浮动操作。如果Rarity等于0-9,那么当产品可能为0.00000时,您会推荐使用什么来存储计算的重量? – Merlin 2014-09-27 14:26:02

+0

@Merlin我的观点是,当你以不规则的比例工作时(如我给出的40和80变成.3333和.6666的例子),它实际上不会加起来1。所以,只要确保你的应用程序编码不依赖于总数就是1. – wavemode 2014-09-27 15:07:02

+0

谢谢!只是想知道最好的数据类型是什么,我暂时切换到十进制来尝试。 – Merlin 2014-09-27 15:17:30