Случайная ротация баннеров в зависимости от стоимости?

Допустим мы имеем систему показа баннеров. Каждый показ баннеров обходится его владельцу в какую-то денежку, размер которой он выставляет сам. Например средняя цена 1 рубль, а кто-то поставил 2 рубля. Хочется чтобы баннеры тех, кто готов тратить больше денег — крутились чаще, но при этом давали возможность более дешевым баннерам так же отображаться в рекламном блоке (допустим, что блок — это страничка с 5 рандомными баннерами). Воспоминания из математики подсказывают мне, что нужно воспользоваться логарифмами/экспонентами для расчета вероятности показа баннера в конкретном блоке в зависимости от его стоимости, но до конца продумать уравнение не могу. Подскажите алгоритм.
  • Вопрос задан
  • 7116 просмотров
Решения вопроса 1
ksurent
@ksurent
Берется отрезок (например, [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() выдает числа с равномерным распределением).
Ответ написан
Пригласить эксперта
Ответы на вопрос 8
@Georg
x = random() //x от 0 до 1
sum = s1+s2+s3 //сумма стоимостей
if (x<s1/sum) then banner1 //если х попало в интервал показа первого баннера, то покажем его
elseif (x<s2/sum) then banner2
elseif (x<s3/sum) then banner3

алгоритм такой
Ответ написан
zona7o
@zona7o
Веб-разработчик
Хм, своего рода цена — это приоритет. Тогда можно воспользоваться следующим алгоритмом.
У нас есть n приоритетов. (1, 2, 3… n). Мы создаем массив данных — куда загоняем баннеры по следующему правилу:
Каждый баннер будет загнан k раз, где k — приоритет. А потом из этого массива будем рандомно выбирать баннер для показа.

Баннер 1 = 1 рубль
Баннер 2 = 2 рубля
Баннер 3 = 3 рубля
Массив = (Баннер 1, Баннер 2, Баннер 2, Баннер 3, Баннер 3, Баннер 3)

Выбирая рандомно из этого массива вы как раз решите свою задачу.
Ответ написан
leventov
@leventov
Это weighted random sampling problem.
Далее в гугле много много ссылок, базовые алгоритмы несколько сложнее чем приведенные выше подходы.
Ответ написан
merlin-vrn
@merlin-vrn
Составляете список из всех вариантов, причём те, которые должны быть в два раза чаще — появляются в списке дважды, соответственно, те, которые должны быть отображены 9 раз из 10, будут заполнять 90% списка. И потом из этого списка выбираете уже произвольный случайный элемент.

Список пересчитывается только при изменении весов или самого набора элементов.

Пример:
[1, 2, 2, 3, 4, 4, 4, 4, 2]
При случайном выборе мы получим:
1 — с вероятностью 1/9
2 — с вероятностью 3/9 = 1/3
3 — с вероятностью 1/9
4 — с вероятностью 4/9
Ответ написан
WhiteD
@WhiteD
Специалист широкого профиля
@ComodoHacker
Вам стоит почитать про алгоритмы планирования задач в операционных системах (task scheduling). Можно отталкиваться от них.

С другой стороны, у вас нет таких жестких ограничений, как при планировании задач, (время на планирование, дискретные приоритеты) поэтому можно рассмотреть и другие подходы.
Ответ написан
lybin
@lybin
looking for remote full time job python backend
табличка:
ссылка, изображение, цена за показ, кол-во показов
link | img | cost | count
SELECT link, img FROM banners ORDER BY (count / cost) ASC LIMIT 1
пишу с хода идею, мог ошибиться, но вроде должно работать
Ответ написан
@hexes
Попробуйте так:
ORDER BY -LOG(1.0 – RAND()) / weight
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы