Проблема:
У меня есть предметы, которые имеют вес. Чем выше вес, тем больше шансов, что предмет попадет первым. Мне нужен чистый и простой способ сделать это, основанный на базовой Java (без сторонних библиотек, jar-файлов и т. д.).
Я сделал это для 2 предметов, суммируя веса, а затем случайным образом выбирая число, используя Math.random()
в пределах этого диапазона. Очень простой. Но для элементов, превышающих 2, я могу либо сделать больше выборок в том же диапазоне с вероятностью промахов, либо я могу пересчитать сумму весов оставшихся элементов и выбрать снова (рекурсивный подход). Я думаю, что может быть что-то, что может сделать это быстрее/чище. Этот код будет использоваться снова и снова, поэтому я ищу эффективное решение.
По сути, это как рандомизированные перестановки веса.
Некоторые примеры:
A
имеет вес 1,B
имеет вес 99. Если бы я запускал симуляцию с этим, я ожидал бы получитьBA
99% времени иAB
1% времени.A
имеет вес 10,B
имеет вес 10, аC
имеет вес 80. Если бы я запускал симуляции с этим, я бы ожидал, чтоC
будет первым элементом в заказе в 80% случаев, в этих случаях ,A
иB
будут иметь равные шансы стать следующим персонажем.
Дополнительные сведения:
Для моей конкретной проблемы существует небольшое количество предметов с потенциально большими весами. Скажем, от 20 до 50 элементов с весами, которые хранятся в виде длинного числа, где минимальный вес составляет не менее 1000. Количество элементов также может немного увеличиться, поэтому, если мы сможем найти решение, которое не требует предметы должны быть маленькими, что было бы предпочтительнее.