Берется отрезок (например, [0, 1]), делится на N частей, где N — количество баннеров. Размер каждой части пропорционален стоимости. Загадывается случайное число в промежутке от 0 до размера отрезка. В какой подотрезок попало число, тот баннер и показывается. В принципе, очень похоже на то, что уже описали выше.
Пример: есть три баннера стоимостью 50, 30 и 10 рублей. Берем отрезок [0, 1] и делим на части:
1. [0, 0.5] — первый баннер
2. (0.5, 0.8] — второй
3. (0.8, 1] — третий (до единицы, т.к. баннеров больше нету)
Загадываем число rand(0, 1), показываем баннер того подотрезка, куда оно попало.
Т.к. у первого баннера самая большая стоимость, то и подотрезок у него самый большой, а значит вероятность попадания случайного числа в этот подотрезок тоже становится выше (при условии, что rand() выдает числа с равномерным распределением).