Я бы предложил бы генерировать рандомное число от 0 до 100, а потом по шансам проверять на то, меньше ли выпавшее число числа шанса. Например:
Шанс на выпадение героя в целом 20%. Выкидываешь рандомное число от 0 до 100, а потом проверяешь - "выпавшее рандомное число меньше шанса (по примеру, 20) на выпадение героя?" и если нет - герой не выпал, но если да, то выбрасываешь новое число от 0 до количества героев всего, что решит, какой герой тебе выпадет
Если нужна редкость - то то рандомное число, которое от 0 до 100 проверяй последовательно, от самой редкой до самой частой редкости
Как-то так