Значит пользовался такой функцией
// Сортируем по весу
static function get_sort($names, $n, $ret = array()) {
if ($n == 0) {
return $ret;
} else {
$totalchance = 0;
$partialsums = [];
foreach ($names as $name) {
$totalchance += $name[1];
array_push($partialsums, $totalchance);
}
$chance = rand(0, $totalchance);
$nameindex = 0;
foreach ($partialsums as $ps) {
if ($ps >= $chance) {
break;
}
$nameindex++;
}
$name = $names[$nameindex];
array_push($ret, $name);
unset($names[$nameindex]);
$names = array_values($names);
return self::get_sort($names, $n-1, $ret);
}
}
Вызов/получение массива:
$ids = class::get_sort($user_id_list, 5);
$user_id_list содержит такого рода массив:
Array
(
[0] => Array
(
[0] => 273904544
[1] => 0.4
)
[1] => Array
(
[0] => 376650423
[1] => 0.78
)
[2] => Array
(
[0] => 396253653
[1] => 0
)
......
Массив может большим вплоть до 1000+
Описание функции:
Из всего массива idшников выводится 5 случайных, но учиваются числа привязанные к idшникам, чем выше это число, тем больше вероятность попасть в список чем у других у кого число меньше.
Так ли это работает? Я проверял, вроде все хорошо, но есть недостатки, один из них это то, что когда получаю список, тот у кого из этих 5 имел больше число, не обязательно стоит на первом месте в массиве, он может быть в любом другом. Получается функция выбирает после каждого элемента следующего начиная все по новой но исключает повторения?