Я пытаюсь найти метод, который мог бы использовать для построения системы, которая бы присваивала веса независимым объектам в таблице для случайной взвешенной сортировки — основываясь на важности этого элемента. Если бы шкала была на 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;
Weight — это число с плавающей запятой от 0,0001 до 1, и на данный момент я в основном назначаю его вручную с помощью простой формы ввода. Идея состоит в том, что Rarity будет обрабатывать сохранение 0-9 и использоваться для автоматического вычисления нового веса на основе всех других записей — так, чтобы общая сумма таблицы равнялась 1.
РЕДАКТИРОВАТЬ: Я прочитал нижнюю часть вашего вопроса.
Этот слегка запутанный запрос приводит к тому, что все поля весов в вашей таблице складываются в 1 пропорционально на основе редкости. (Это, вероятно, будет больше похоже на .9999999998)
UPDATE block_types SET Weight=Rarity/(SELECT SUM(Rarity) AS r FROM (SELECT Rarity FROM block_types) AS bt);
Например, если есть два ряда, один с редкостью 40, а другой с редкостью 80, вы в итоге получите вес .3333 и .6666 (40 — 1/3 от общего числа 120, а 80 — 2/3). ,
Надеюсь, это поможет.
Других решений пока нет …