2012-02-22 175 views
3

什麼是使用嵌套數組中的權重混洗數組或數組的好算法?陣列或陣列的加權混洗?

實施例:

$array = array(
    array("name"=>"John", "rank"=>3), 
    array("name"=>"Bob", "rank"=>1), 
    array("name"=>"Todd", "rank"=>8), 
    array("name"=>"Todd", "rank"=>14), 
    array("name"=>"Todd", "rank"=>4) 
); 

我想隨機洗牌的數組,但我想rank值是一個重量。因此,排名較低的人更有可能位列榜首。

我已經嘗試了一些東西,比如通過數組迭代,拉出使用mt_rand(mt_rand(0,$value),$value)選擇陣列,但我不認爲我是在正確的軌道上......

回答

3

我能解決這個問題,像這樣:

function compare($a, $b) 
{ 
    $share_of_a = $a['rank']; 
    $share_of_b = $b['rank']; 
    return mt_rand(0, ($share_of_a+$share_of_b)) > $share_of_a ? 1 : -1; 
} 

usort($array, "compare"); // Sort the array using the above compare function when comparing 
$array = array_reverse($array); 
+0

如果你解決了你自己的問題,你應該接受你自己的答案。 – 2012-02-23 08:03:44

+1

在發佈問題後的48小時之內,不能接受您自己的答案。 – 2012-02-23 16:33:00

2

你可以嘗試像這樣的:

function weightedshuffle ($a, $b) { 
    return rand(0, $a['rank'] + $b['rank']) <= $a['rank']; 
} 

usort($data, 'weightedshuffle'); 
+1

我不知道PHP的細節,但你肯定不應該能夠使用該功能進行排序 - 這是不是等價關係。 – 2012-02-22 21:20:42

+1

http://codepad.org/gJfzxkEU - 它的工作.. – gintas 2012-02-22 21:26:28

+0

有趣的。那麼,我不確定這是什麼意思排序的東西不是一個等價關係,但如果它的工作,它的工作,我猜。 – 2012-02-22 21:31:27