TransWikia.com

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

Stack Overflow на русском Asked by iKey on January 7, 2021

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

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

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

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

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

One Answer

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

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

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP