Разделите диапазон генератора случайных чисел на пропорциональные сегменты и, исходя из того, в какой сегмент попало следующее случайное число, выберите соответствующее число из вашего набора.
Что-то вроде (упрощенно):
const int numbers[3] = { 1, 17, 18 };
const int borders[2] = { 0.30*MAX_RANDOM, (0.30 + 0.15) * MAX_RANDOM };
int i = random.next(), num;
if (i < borders[0]) num = number[0];
else if (i < borders[0]) num = number[1];
else num = number[2];
Конечно, если чисел больше трех, лучше использовать цикл.
Примечание: в отличие от решения Джона Скита, оно может обеспечить любую желаемую степень детализации до 1 / (MAX_RANDOM + 1) (что часто составляет до 2 ^ 32 на 32-битных машинах), а не строго 1%.