Stack Overflow на русском Asked by iKey on January 7, 2021
Есть массив вида:
ключ => значение
0 => 10,
1 => 5,
2 => 1,
3 => 4
4 => 6,
5 => 4
Мне нужно сделать как бы рандомный выбор одного из элементов массива, НО, чтобы тот элемент где значение меньше – выбирался реже, а тот где значение больше – выбирался чаще. При чем чем дальше значение от 10 – тем реже этот элемент выбирался.
Значение максимум может быть 10, минимум 1.
Буду благодарен за помощь!
Функция возвращает индекс случайного элемента, выбранного в соответствии с его весом.
function getRand($list) {
$sum = array_sum($list); // сумма весов элементов
$rnd = mt_rand(0, $sum); // выбираем число от нуля до суммы весов
foreach ($list as $i => $v) {
$rnd -= $v; // идём по интервалам, смотрим куда попали
if ($rnd <= 0) return $i;
}
return 0; // Unreached
}
Демонстрация работы функции:
$arr = [10, 5, 1, 4, 6, 4];
$stat = [];
for($i = 0; $i < 1000; $i++) {
$index = getRand($arr);
$stat[$index] = ($stat[$index] ?? 0) + 1;
}
asort($stat);
$values = array_map(function($k) use ($arr) {return $arr[$k];}, array_keys($stat));
echo json_encode($stat), PHP_EOL;
echo json_encode($values), PHP_EOL;
Answered by vp_arth on January 7, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP