题
我有横幅广告,具有数量的视图,例如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
在我的网站上,横幅必须出现在此位置(当页面重新加载时):
banner1 banner2 banner1 banner2 banner3
如果视图数量较高,则幻影的概率更高
我该如何在PHP中执行此操作?
解决方案
首先,您的系统只是... 愚蠢的. 。它可以使横幅具有许多视图,而新创建的横幅具有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
)
其他提示
这是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
具有更多观点的横幅将有更高的机会成为最佳结果
不隶属于 StackOverflow