【问题标题】:banner rotator advertising with probability带有概率的横幅旋转广告
【发布时间】:2010-05-01 22:20:55
【问题描述】:

我有带有浏览量的横幅广告,例如 CPM 系统。 例如:

i have 3 banner:
banner1 with 20.000 nr of views
banner2 with 10.000 nr of views
banner3 with 5.000 nr of views

在我的网站上,横幅必须出现在这个位置(当页面重新加载时):

横幅1 横幅2 横幅1 横幅2 横幅3

观看次数越多,出现的概率就越高

我如何在 php 中做到这一点?

【问题讨论】:

    标签: php ads banner


    【解决方案1】:

    首先,您的系统只是... 愚蠢。它使具有大量浏览量的横幅永久存在,而具有 0 或很少浏览量的新创建的横幅将永远没有机会被选中,因此 将永远不会被实际看到...

    话虽如此,如果你有一个如下所示的数组:

    $banners = array
    (
        'banner1' => 1,
        'banner2' => 2,
        'banner3' => 4,
        'banner4' => 8,
        'banner5' => 16,
    );
    

    您可以使用类似这样的功能来选择一个横幅:

    function Probability($data)
    {
        if (is_array($data) === true) {
            $result = 0;
            $probability = mt_rand(1, array_sum($data));
    
            foreach ($data as $key => $value) {
                $result += $value;
    
                if ($result >= $probability) {
                    return $key;
                }
            }
        }
    
        return false;
    }
    

    用法(测试一下@ CodePad.org@ IDEOne):

    echo Probability($banners); // banner5
    

    100 次处决的样本:

    Array
    (
        [banner5] => 41
        [banner4] => 38
        [banner3] => 10
        [banner2] => 8
        [banner1] => 3
    )
    

    【讨论】:

      【解决方案2】:

      这是一个php的方法

      我在想象你的数组看起来像这样......

      $banners = array(
      
          array (
              'name' => 'banner1',
              'views' => 20
          ),
          array (
              'name' => 'banner2',
              'views' => 10
          ),
          array (
              'name' => 'banner3',
              'views' => 5
          )
      );
      

      这个函数基本上循环遍历横幅,无论横幅有多少视图,它的数组索引的许多项目都会添加到数组中。然后随机选择一个。拥有更多浏览量的项目更有可能被选中。

      function getWeightedRandom( $array ) {
      
          $universe_array = array();
      
          foreach ( $array as $k => $b ) {
              $universe += $b['views'];
              $universe_array = array_pad( $universe_array, $universe, $k );
      }
      
          $rand = mt_rand( 0, count( $universe_array ) -1 );
          return $array[ $universe_array[ $rand ] ];
      
      }
      
      
      $r = getWeightedRandom($banners);
      print_r($r);
      

      一个简单的mysql选项是:

      select * from banners order by rand() * views desc limit 1
      

      查看次数越多的横幅将有更高的机会成为最佳结果

      【讨论】:

      • -1,该 SQL 查询将始终返回查看次数最多的横幅。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-27
      • 2014-10-16
      • 2017-04-30
      • 2021-02-26
      • 1970-01-01
      • 2020-11-20
      • 1970-01-01
      相关资源
      最近更新 更多