Я собираюсь улучшить ответ https://stackoverflow.com/users/626341/masciugo.
По сути, вы создаете один большой массив, в котором количество отображаемых элементов пропорционально весу.
У него есть некоторые недостатки.
- Вес не может быть целым числом. Представьте, что элемент 1 имеет вероятность пи, а элемент 2 имеет вероятность 1-пи. Как вы это делите? Или представьте, если таких элементов сотни.
- Созданный массив может быть очень большим. Представьте, что если наименьший общий множитель равен 1 миллиону, то нам потребуется массив из 1 миллиона элементов в массиве, который мы хотим выбрать.
Чтобы противостоять этому, это то, что вы делаете.
Создать такой массив, но вставлять элемент случайным образом. Вероятность того, что элемент вставлен, пропорциональна весу.
Затем выберите случайный элемент из обычного.
Таким образом, если есть 3 элемента с различным весом, вы просто выбираете элемент из массива из 1-3 элементов.
Проблемы могут возникнуть, если построенный элемент пуст. То есть просто так получается, что в массиве нет элементов, потому что их игральные кости по-разному катятся.
В этом случае я предлагаю, чтобы вероятность вставки элемента была p (вставлена) = wi / wmax.
Таким образом, будет вставлен один элемент, а именно тот, который имеет наибольшую вероятность. Другие элементы будут вставлены с относительной вероятностью.
Скажем, у нас есть 2 объекта.
элемент 1 отображается в .20% времени.
Элемент 2 обнаруживается в .40% времени и имеет наибольшую вероятность.
В массиве элемент 2 будет отображаться постоянно. Элемент 1 будет отображаться в половине случаев.
Таким образом, элемент 2 будет называться в 2 раза больше, чем элемент 1. Для общности все остальные элементы будут называться пропорционально их весу. Также сумма всех их вероятностей равна 1, потому что массив всегда будет содержать хотя бы 1 элемент.