2013-01-11 68 views
1

我想從用戶列表中隨機選擇一個用戶,但是我希望VIP用戶有更高的選擇概率,如何實現這樣的算法?如何控制隨機選擇的概率?

的樣本數據:

$users = array(
    array('name'=>'user1', 'is_vip'=>false), 
    array('name'=>'user2', 'is_vip'=>false), 
    array('name'=>'user3', 'is_vip'=>false), 
    array('name'=>'user4', 'is_vip'=>false), 
    array('name'=>'user5', 'is_vip'=>false), 
    array('name'=>'user6', 'is_vip'=>true), 
    array('name'=>'user7', 'is_vip'=>false), 
    array('name'=>'user8', 'is_vip'=>false), 
    array('name'=>'user8', 'is_vip'=>true), 
    array('name'=>'user10', 'is_vip'=>true), 
    array('name'=>'user11', 'is_vip'=>false), 
    array('name'=>'user12', 'is_vip'=>false), 
); 
+2

你接受的答案? – paddy

回答

4

您可以通過從離散分佈採樣解決這個問題。根據用戶是否是VIP,爲每個不同的用戶分配權重,然後使用加權隨機採樣算法隨機選擇它們,但偏向VIP用戶。

有很多這樣的算法,其中許多算法是快速和容易編碼。有一個detailed write up available online,詳細介紹了其中的很多。

希望這會有所幫助!

0

這最有可能是不「正確」的方式做到這一點,但你可以將它們拆分:

foreach($users as $spUsers){ 
    if($spUsers['is_vip']==true){ 
     $splitUsers[0][]=array('name'=>$spUsers['name'],'is_vip'=>$spUsers['is_vip']); 
    } else { 
     $splitUsers[1][]=array('name'=>$spUsers['name'],'is_vip'=>$spUsers['is_vip']); 
    } 
} 

function weightedrand($min, $max, $gamma) { 
    $offset= $max-$min+1; 
    return floor($min+pow(lcg_value(), $gamma)*$offset); 
} 

伽馬1加權,降低提供了更多的數字較高,反之亦然

$array_to_pick_from = weightedrand(0, 1, .5); 

$ array_to_pick_from將有一個數組從中選擇一個隨機用戶。

就像我說的這可能不是最好的辦法。但它應該做的伎倆,直到有人更聰明,然後我滾動。

我得到了這個答案加權隨機: Generating random results by weight in PHP?