if (test-x)>0 return Z
А теперь по русски:
пишешь последовательность вот таких строчек с Z равным интересующим числам в обратном порядке (сначала для для Z соответствующих большим значениям равномерно распределнного случайного числа (это которое выпавший процент)).
test'ом для каждого Z должна быть нижняя граница диапазона процентов для этого Z.
Можно по-другому:
Берешь случайный процент.
Перебираешь все Z по порядку и считаешь суммарную вероятность выпадения всех этих чисел (12+5+1+30+...), и как только на N-ом Z эта сумма станет больше выброшенного случайного числа процентов, возвращаешь предыдущее значение Z, (N-1)-е (Н-минус-первое
)