Изменил(а) на 'ItemRoulette/ItemRoulette.php'
* Замена цикла `for` на функцию `pow()`; * Функция `countDecimals()` заменена на `randMax()`, выполняющую более комплексную задачу благодаря использованию `pow()`;
This commit is contained in:
parent
ecaeb9e8ed
commit
f82b08cb98
@ -6,21 +6,22 @@ class ItemRoulette
|
||||
private array $items;
|
||||
|
||||
/**
|
||||
* Рассчёт количества знаков после запятой у значения подаваемого на вход.
|
||||
* Рассчёт верхнего значения диапазона, подаваемого на рандомизатор через
|
||||
* множитель в зависимости от количества знаков после запятой у значения подаваемого на вход, умноженный на это значение.
|
||||
* Если на вход идёт целое число, система возвратит 0;
|
||||
* Если на вход идёт дробное число, система вернёт количество знаков;
|
||||
* Если на вход идёт вообще не число, система всё равно вернёт 0;
|
||||
*
|
||||
* @param $num
|
||||
* @return int количество знаков после запятой.
|
||||
* @return int множитель.
|
||||
*/
|
||||
private function countDecimals($num): int
|
||||
private function randMax($num): int
|
||||
{
|
||||
if ((int)$num == $num || !is_numeric($num)) {
|
||||
return 0;
|
||||
}
|
||||
list(, $a) = explode('.', strval($num));
|
||||
return strlen($a);
|
||||
return $num * pow(10, strlen($a));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -36,16 +37,10 @@ class ItemRoulette
|
||||
private function roll(): string
|
||||
{
|
||||
$sumOfPercents = 0;
|
||||
$multiplier = 1;
|
||||
foreach ($this->items as $itemsPercent) {
|
||||
$sumOfPercents += $itemsPercent;
|
||||
}
|
||||
$cd = $this->countDecimals($sumOfPercents);
|
||||
for ($i = 0; $i < $cd; $i++) {
|
||||
$multiplier *= 10;
|
||||
}
|
||||
$sumOfPercents *= $multiplier;
|
||||
$rand = mt_rand(1, (int)$sumOfPercents);
|
||||
$rand = mt_rand(1, $this->randMax($sumOfPercents));
|
||||
$rangeStart = 1;
|
||||
foreach ($this->items as $itemKey => $itemsPercent) {
|
||||
$rangeFinish = $rangeStart + ($itemsPercent * $multiplier);
|
||||
|
Loading…
Reference in New Issue
Block a user