За последние 24 часа нас посетили 16843 программиста и 1641 робот. Сейчас ищет 901 программист ...

Какой алгоритм нужен?

Тема в разделе "Прочие вопросы по PHP", создана пользователем Lex243, 15 дек 2010.

  1. Lex243

    Lex243 Активный пользователь

    С нами с:
    15 дек 2010
    Сообщения:
    16
    Симпатии:
    0
    Вообщем суть примерно такова,допустим мне нужно выводить скриптом некие сообщения,эти сообщения имеют коэффициент,допустим сообщение 1 60% и сообщение 2 40%
    Конечное число показов неизвестно,нужно выводить так чтобы примерно в таких процентных соотношениях оставалось.
    Как такое можно реализовать?
     
  2. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    PHP:
    1. <?php
    2. if(rand(0,100)<61){
    3.     printFirstPage();
    4. }else{
    5.     printSecondPage();
    6. }
    7.  
     
  3. Nazorei

    Nazorei Активный пользователь

    С нами с:
    1 фев 2007
    Сообщения:
    228
    Симпатии:
    0
    Volt(220)
    кажется это не то, что ему нужно
     
  4. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Nazorei
    Тут вообще сложно понять что нужно...
    Это мне кажется наиболее вероятным вариантом.
     
  5. Lex243

    Lex243 Активный пользователь

    С нами с:
    15 дек 2010
    Сообщения:
    16
    Симпатии:
    0
    Постараюсь раскрыть суть полнее,сообщения может быть не 2,вообщем это что-то похожее на крутилку баннеров

    Можно добавлять элементы,их может быть и один и десять,и у каждого можно выставить коеффициент некий,впринципе не обязательно в процентах

    Суть в том чтобы сообщение с большим коэффициентом показывалось чаще,а с меньшим реже

    Проблема как раз в том,что заранее не известно ни конечное количество показов,ни количество сообщений
    думал насчет рандома,но возникает проблема,когда сообщения 2 тут все просто,если значение меньше 60 то первое сообщение,если больше то второе.

    Но если их допустим 4 и получается 30%,10%,45% и 15%

    Уже всю голову сломал,как подсчитать
     
  6. Lex243

    Lex243 Активный пользователь

    С нами с:
    15 дек 2010
    Сообщения:
    16
    Симпатии:
    0
    Думается мне что тут следует применить теорию вероятности,но пока хорошие студенты учили ее,я писал на PHP((((
     
  7. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    эта тема уже обсуждалась на форуме. одно из решений - использование весов.

    минимально требуется таблица из 3-х полей (остальные - по усмотрению):
    айди - уникальный айди чего-то там, объекта, статьи, баннера...
    вес - в цифровом виде целое число от 1 до 100, или до 1000, или вообще любое, главное - больше 0.
    сгенерированная позиция - сумма всех весов предыдущих объектов + текущий вес.

    Пример таблицы:
    Код (Text):
    1.  
    2. id    weight    generated
    3. 1     10        10
    4. 2     40        50
    5. 3     90        140
    6. 4     15        155
    7. 5     200      355
    8. 6     10        365
    9. 7     25        390
    10. 8     50        440
    11. 9     20        460
    генерируешь число от 1 до максимального сгенерированного значения (в данном случае 460) - для примера пусть сгенерировалось число 312.
    делаешь запрос SELECT id FROM table_weights WHERE generated < 312 ORDER BY generated DESC LIMIT 1 и получаешь свой баннер, объект, статью или чего-то там ещё.

    Возможны проблемы с изменением/удалением весов и регенерации третьего поля для всей таблицы, но это уже сам будешь думать как решать. Можно вообще обойтись без третьего поля, но тогда придётся высчитывать эти значения в коде самому, и запрос будет больше. В общем смотри сам, а то совсем готовое решение как бэ не оставит простора для полёта мысли ;)
     
  8. Lex243

    Lex243 Активный пользователь

    С нами с:
    15 дек 2010
    Сообщения:
    16
    Симпатии:
    0
    Рееееспектищеее!!!!

    Я пытался вероятности считать,как обычно все гениальное просто
     
  9. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    Gromo

    Сорри за нубский вопрос - а как это работает? ))
     
  10. Lex243

    Lex243 Активный пользователь

    С нами с:
    15 дек 2010
    Сообщения:
    16
    Симпатии:
    0
    tommyangelo

    В упрощенном виде можно сделать так

    id k result
    1 45 45
    2 10 55
    3 30 85
    4 15 100

    получаем рандомом число от 0 до 100 и смотрим из какого оно диапазона,допустим мы получили 76, это меньше 85 но не меньше 55,значит зпрос вернет id 3

    Таким образом чем больше коэффициент объекта,тем больше диапазон и больше вероятность выпадения
     
  11. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    а, вдуплил)))

    Lex243 спасибо за ключевое слово -
    Получается у id2 - диапазон всего 10 единиц, а у id1 аж 45. Понятно )))