2017-02-14 4 views
-1

Например, у меня есть массив, как:Случайное распределение взвешенного

$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

Здравствуйте, мы не разработчики нанимаем. Попытайтесь сделать это сами, тогда, если у вас есть ошибки, мы сможем вам помочь. –

+0

Эй, парень, я не могу понять алгоритм и хочу помочь ему разобраться. Может быть, вы знаете формулу, которая может помочь? На первый взгляд задача кажется легкой, но я не могу ее понять. – niQitos

+2

Это называется «случайным взвешенным распределением». Ищите это в Интернете с помощью языка, который вы используете. Кстати, вы даже не сказали, какой язык вы используете. –

ответ

0

Вот решение, которое я придумал благодаря намеку Оливера. $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"; 
Смежные вопросы