Взвешенное перемешивание массива или массивов? - PullRequest
4 голосов
/ 23 февраля 2012

Что такое хороший алгоритм, который перетасовывает массив или массивы, используя веса из вложенных массивов?

Пример:

$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), но я не думаю, что я на правильном пути ...

Ответы [ 2 ]

4 голосов
/ 23 февраля 2012

Мне удалось решить эту проблему так:

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 голосов
/ 23 февраля 2012

Вы можете попробовать что-то вроде этого:

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

usort($data, 'weightedshuffle');
...