За последние 24 часа нас посетили 36569 программистов и 7751 робот. Сейчас ищут 1886 программистов ...

Ротация баннеров с приоритетом

Тема в разделе "PHP для новичков", создана пользователем JonyFront, 2 дек 2016.

  1. JonyFront

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

    С нами с:
    5 июн 2016
    Сообщения:
    143
    Симпатии:
    1
    Здравствуйте! Пишу скрипт ротации баннеров простым методом чтобы вставить на сайт, и хочу чтобы был приоритет на выводе который я задам вручную, но не пойму как это реализовать, прошу вашей помощи...
    Вот код вывода баннеров
    PHP:
    1. $banners = array ();
    2. $banners[] = 'Баннер 1'; // показывается пользователю в 70% случаев
    3. $banners[] = 'Баннер 2'; // показывается пользователю в 7% случаев
    4. $banners[] = 'Баннер 3'; // показывается пользователю в 10% случаев
    5. $banners[] = 'Баннер 4'; // показывается пользователю в 13% случаев
    6.  
    7. echo $banners[array_rand ($banners)];
    Как сделать чтобы я выставил приоритет как в комментах для каждого баннера и они отображались исходя из этого приоритета и 100% показов по общему. То бишь пользователю показывается на 70% заходов 1 баннер, а остальные уже в порядке приоритета. Заранее спасибо за помощь!
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.012
    Симпатии:
    1.679
    Адрес:
    :сердА
    У тебя сейчас просто выброс рандома. А нужна стохастическая выборка. Она делается иначе:
    1) Сначала получаете число rand (0, 100);
    2) Потом, сравниваете это число с установленной вероятностью появления баннера, представленной как диапазон (M-N ; M), где M - это наибольшая нераспределенная вероятность, а N - искомая вероятность события.

    То есть, если вам нужно показывать баннер с 70% вероятностью, то, его следует показывать, если выпавшее число лежит в интервале от 3 до 100. Ведь нераспределенная вероятность изначально 100%.
     
    JonyFront нравится это.
  3. JonyFront

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

    С нами с:
    5 июн 2016
    Сообщения:
    143
    Симпатии:
    1
    Спасибо, получилось так:
    PHP:
    1. for($i=0;$i<10;$i++) $banners[] = "Баннер 1";
    2. for($i=0;$i<30;$i++) $banners[] = "Баннер 2";
    3. for($i=0;$i<50;$i++) $banners[] = "Баннер 3";
    4. for($i=0;$i<10;$i++) $banners[] = "Баннер 4";
    5.  
    6.     $rand = $banners[rand(0,count($banners))];
    7.  
    8.     echo $rand;
    Можно ли как-то упростить его, и более удобным по смене % приоритета сделать(чтобы я сменил % в 1 и в других соотношение подстроилось? и у меня почему-то бывает проскакивает пустой результат... Заранее спасибо!)
     
  4. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.012
    Симпатии:
    1.679
    Адрес:
    :сердА
    Однако, код со вкусом карри..

    почему бы просто не взять число от 0 до 100 и не проверить его вхождение в интервал через if?
     
  5. JonyFront

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

    С нами с:
    5 июн 2016
    Сообщения:
    143
    Симпатии:
    1
    хз, что-то не пойму как ...(
     
  6. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.012
    Симпатии:
    1.679
    Адрес:
    :сердА
    Вот вам стендовый пример:

    PHP:
    1. <?php
    2. $chance = 70; //Вероятность показа
    3.  
    4. $test_counter = 0; //Счетчик показов
    5. for ($i=0; $i<100; $i++){ //Цикл, имитирующий 100 посещений
    6.     $random_value = rand(0,100);
    7.     if ($random_value>100-$chance){
    8.         $test_counter++; // Если показ состоялся, увеличивем счетчик
    9.     }
    10. }
    11.  
    12. echo 'Banner was shown for ',$test_counter,' times'; // Узнаем, сколько раз был показан баннер
    13.  
    14. //В среднем число будет стремиться к 70. Плюс минус. Теория вероятности беспощадная стерва.
     
    JonyFront нравится это.
  7. JonyFront

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

    С нами с:
    5 июн 2016
    Сообщения:
    143
    Симпатии:
    1
    А в чем разница с моим кодом? вроде бы так же
    --- Добавлено ---
    Я просто буду записывать текст и его приоритет в бд, и оттуда массивом выводить в php, и там она выводит через условие например как я выше скинул, вот только как бы это все удобней сделать - хз...
     
  8. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.012
    Симпатии:
    1.679
    Адрес:
    :сердА
    Нет, не так же. У вас генерятся массивы, в которых одно и то же значение повторяется черти знает сколько раз, потом берется рандомное число и выдергивается такая-то ячейка массива. Это решение несколько неочевидное, избыточное и не самое изящное, без обид.

    В то же время у меня нет никаких избыточных данных. Только число, описывающее вероятность, рандомное число, и проверка рандомного числа на вхождение в текущую вероятность.
     
    #8 Fell-x27, 3 дек 2016
    Последнее редактирование: 3 дек 2016
    denis01 нравится это.