User Manual 1 - Всё на свете неслучайно

Nov 15, 2012 02:21

Звучат литавры. Оркестр играет фанфары. С громким щелчком над ареной зажигаются прожекторы. Сегодня ночью в этом журнале торжественно открывается рубрика "User Manual", где я буду рассказывать об интересных задачах, с которыми сталкиваюсь в работе и о том, как я их решил.
Я буду делать это в предельно ясном формате: сначала простым человеческим языком расскажу короткую предысторию о том, как эта задача вообще появилась, зачем это надо и что я имею для её решения. Потом опишу саму задачу и исходные данные. Затем, под катом (чтобы ты сам мог включить мозги и сам придумать решение задачи), я расскажу о найденном мной решении и о том, что вышло в итоге.

А ты предложи своё решение или выскажи мнение о моём. Не будь мудаком - будь нормальным челом. Не будь тупым потребителем - будь охуенным созидателем. Это же круче.

Я неистово люблю жёсткую критику. Если она по делу - я узнаю что-то новое и интересное. А если нет - ржу. Ещё сильнее люблю восхваление и боготворение. Так что, не стесняйся, ругай меня, хвали, пори хуйню. Это будет весело.

Поехали. Для начала простая задачка.

User Manual 1 - Всё на свете неслучайно
Есть сайт, на котором вовсю идёт конкурс, на который одни люди отправляют свои видео, а другие за эти видео голосуют.
При выводе всех видеозаписей они сортируются по количеству голосов, менять это нельзя. Проблема появилась тогда, когда появились лидеры. Новые видео, присылаемые на конкурс, и старые, которые по какой-то причине не набрали вовремя достаточного количества голосов, теряют шанс быть замеченными и оцененными, потому что оказываются в глубокой жопе списка.
Было решено на всех страницах сайта ненавязчиво выводить на видном месте модуль со случайным видео. Вернее, почти случайным. Чем меньше голосов у видео, тем чаще оно должно там появляться.

Входные данные
Таблица с двумя столбцами:
  • id видео
  • количество голосов
Ожидаемый результат
Вероятность выпадения каждого видео находится в обратной зависимости от количества голосов. Эту зависимость надо выбрать таким образом, чтобы вполне реально было увидеть даже видео с 7000 голосов. Но чтобы до хера более вероятно было улицезреть те, у которых 0, 20 и 50. Ну, и, ясен день, 0 показывать чаще, чем 1. А 1 - чаще, чем 10. А 10 - чаще чем 30. Ну ты понял.


формируем двумерный массив со столбцами:
    id | votes | k
где k (назовём его красиво - "коэффициент невероятности") вычисляется по формуле:
k = rand(0,1000)/(sqrt(votes)+10);

Теперь выбираем видео с наибольшим k и выводим его.
Просто, быстро, красиво, нужный результат получен.

программирование, user manual

Previous post Next post
Up