Weighted Shuffle of an Array or Arrays?

2019-05-06 14:24发布

问题:

What is a good algorithm that shuffles an array or arrays using weights from the nested arrays?

Example:

$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)
);

I want the array randomly shuffled but I want the rank value to be a weight. So those with a low number rank are more likely to be at the top of the list.

I've experimented with a few things, like iterating through the array and pulling out arrays chosen using mt_rand(mt_rand(0,$value),$value) but I don't think I'm on the right track...

回答1:

I was able to solve this problem like so:

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);


回答2:

You can try something like this:

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

usort($data, 'weightedshuffle');