2010-05-01 103 views
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 

,並在我的網站的旗幟必須出現在這個位置(當頁面重新加載):

banner1 banner2 banner1 banner2 banner3

如果的若干意見是高於那麼幻影的概率更高

我怎麼能做到這一點在PHP?

回答

2

首先的機會較高,您的系統只是...... 愚蠢的。它延續橫幅,有很多的意見,而新創建的橫幅0或一些看法將永遠不會被拾起的機會,因此將永遠不會真正看到 ...

話雖這麼說,如果你有一個數組看起來是這樣的:

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

可以使用這樣的函數之一weightily挑一個條幅:

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):從100個處決

echo Probability($banners); // banner5 

樣品:

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 

橫幅更多的意見,將有被頂結果

+0

-1,即SQL查詢將總是返回最欣賞的一面旗幟。 – 2010-05-02 05:35:10

+0

其實它不會。 – Galen 2010-05-02 05:53:17

+0

對不起,我改變了我的投票。 – 2010-05-03 23:31:57