Составления алгоритма выпадения предметов
Нужно составить алгоритм выпадения предметов.
Входные данные:
open_cost
- Стоимость открытия.
items
- Массив предметов которые могут выпасть.
item['cost']
- Стоимость предмета по отдельности.
Также можно использовать:
items_count
- Количество всех предметов.
items_cost
- Стоимость всех предметов.
И т.п.
Алгоритм должен выдавать в среднем предмет со стоимостью равной стоимости открытия.
Мне нужен алгоритм на php. Вы можете писать на любом удобном языке, мне главное понять принцип.
Так же у меня есть свой алгоритм, но его проблема в том что для разных предметов требуется разный коэффициент, и его приходить находить с помощью подбора.
Вот данный алгоритм:
function getClosest($search, $array)
{
$num = null;
foreach ($array as $item) {
if ($item['chance'] < $search) {
continue;
}
if ($num === null || $item['chance'] < $num['chance']) {
$num = $item;
}
}
return $num;
}
function getRandomSkin($items, $open_cost, $coeff)
{
$accum = 0;
foreach ($items as &$item) {
if ($open_cost >= $item['cost']) {
$chance = $item['cost'] / $open_cost * $coeff;
} else {
$chance = $open_cost / $item['cost'];
}
$item['chance'] = round($chance, 3) * 1000;
$accum = $skin['chance'] += $accum;
}
$rand_num = rand(0, end($items)['chance']);
$rand_element = getClosest($rand_num, $items);
return $rand_element;
}
Пример:
$items = [
['id' => 1, 'cost' => 50],
['id' => 2, 'cost' => 100],
['id' => 3, 'cost' => 10],
['id' => 4, 'cost' => 200],
];
$open_cost = 50;
Исходя из этих данных шансы на выпадения предметов должны быть такими:
Формула - $item['cost'] / $open_cost
id_1 - 1
id_2 - 2
id_3 - 5
id_4 - 4
Чем меньше число тем больше шанс на выпадение.