Я пытаюсь выяснить, как выбрать случайный элемент с его собственным шансом из таблицы значений, например:
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, что даст игрокам случайный лотерейный предмет, основанный на шансах.
Изменение: вам нужно получить один элемент, и вы не можете получить несколько элементов. чем выше вероятность, тем больше вероятность получить этот предмет.
Вы можете сделать это в 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
. Альтернативой является вычисление его явно с помощью подзапроса.