2012-02-22 95 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