5

ネストされた配列の重みを使用して配列をシャッフルする優れたアルゴリズムは何ですか?

例:

$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)が、正しい軌道に乗っているとは思いません...

4

3 に答える 3

5

この問題を次のように解決できました。

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);
于 2012-02-22T22:54:40.320 に答える
1

次のようなことを試すことができます:

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

usort($data, 'weightedshuffle');
于 2012-02-22T21:16:50.467 に答える