4

我有带有浏览次数的横幅广告,例如 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 中做到这一点?

4

2 回答 2

3

首先,您的系统只是......愚蠢。它使具有大量视图的横幅永久存在,而具有 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
)
于 2010-05-02T02:49:19.120 回答
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

具有更多浏览量的横幅将有更高的机会成为最佳结果

于 2010-05-02T00:03:35.647 回答