Как чаще выдавать наибольшее число?

Есть массив вида:

ключ => значение
0 => 10,
1 => 5,
2 => 1,
3 => 4
4 => 6,
5 => 4

Мне нужно сделать как бы рандомный выбор одного из элементов массива, НО, чтобы тот элемент где значение меньше - выбирался реже, а тот где значение больше - выбирался чаще. При чем чем дальше значение от 10 - тем реже этот элемент выбирался.

Значение максимум может быть 10, минимум 1.

Буду благодарен за помощь!


Ответы (1 шт):

Автор решения: vp_arth

Функция возвращает индекс случайного элемента, выбранного в соответствии с его весом.

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;
→ Ссылка