2014-09-27 148 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