您需要创建一个用于丢弃对象的算法。
输入数据:
open_cost
- 开业成本。
items
- 一系列可以掉落的物品。
item['cost']
- 项目的成本单独。
您还可以使用:
items_count
- 所有项目的数量。
items_cost
- 所有项目的成本。
等等。
该算法应该平均给出一个成本等于发现成本的项目。
我需要一个 php 算法。你可以用任何方便的语言来写,对我来说最主要的是理解原理。
我也有自己的算法,但是它的问题是不同的item需要不同的系数,用selection来找。
这是算法:
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
数字越低,掉落的几率就越大。
您可以通过通常的回调排序来实现此行为。
回答:
游乐场: https://onlinephp.io/c/d9e8b,你可以玩一下看看结果。
请注意,代码是有效的,但概念上的,如除以 0 和其他东西的细节没有处理,我们会留给你)
代码: