Случайное взвешенное распределение

Например, у меня есть массив как:

$items = [
'0' => [
'name' => 'item1',
'percent' => 10
],
'2' => [
'name' => 'item2',
'percent' => 20
],
'3' => [
'name' => 'item3',
'percent' => 30
],
'4' => [
'name' => 'item4',
'percent' => 40
],
];

И функция:

function echoRandomItem(){
}

Если я вызываю эту функцию, она должна вернуть 'name' элемента в зависимости от 'percent' значение. В принципе, если я вызову эту функцию 100 раз, она должна вернуть item1 10 раз, item2 20 раз, item3 30 раз, item4 40 раз.

-1

Решение

Вот решение, которое я придумала благодаря подсказке Оливера. $items это заданный массив. wrand() Функция отвечает за расчет случайного взвешенного распределения.

$items = [
'1' => [
'name' => 'item1',
'rand' => 10
],
'2' => [
'name' => 'item2',
'rand' => 20
],
'3' => [
'name' => 'item3',
'rand' => 30
],
'4' => [
'name' => 'item4',
'rand' => 40
],
];

function wrand($data) {

foreach ($data as $value) {
$itemsRand[] = $value ['rand'];
}

$totalw = array_sum($itemsRand);
$rand   = rand(1, $totalw);

$curw   = 0;
foreach ($data as $val) {
$curw += $val['rand'];
if ($curw >= $rand) return $val['name'];
}

return end($data);
}

Далее код просто звонит wrand() функция 100 раз и считает результаты.

static $item1 = 0;
static $item2 = 0;
static $item3 = 0;
static $item4 = 0;

for ($i = 0; $i < 100; $i++){
$k = wrand($items);

if ($k == 'item1') {
$item1++;
} elseif ($k == 'item2'){
$item2++;
} elseif ($k == 'item3'){
$item3++;
} elseif ($k == 'item4'){
$item4++;
}
}

echo "item1 = $item1<br>";
echo "item2 = $item2<br>";
echo "item3 = $item3<br>";
echo "item4 = $item4";
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]