From f82b08cb98f538fcc81da18a04fcb0c4d9d78396 Mon Sep 17 00:00:00 2001 From: Ivor Barhansky Date: Wed, 2 Feb 2022 17:57:29 +0000 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8=D0=BB(?= =?UTF-8?q?=D0=B0)=20=D0=BD=D0=B0=20'ItemRoulette/ItemRoulette.php'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Замена цикла `for` на функцию `pow()`; * Функция `countDecimals()` заменена на `randMax()`, выполняющую более комплексную задачу благодаря использованию `pow()`; --- ItemRoulette/ItemRoulette.php | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/ItemRoulette/ItemRoulette.php b/ItemRoulette/ItemRoulette.php index ac77bb4..0b1347b 100644 --- a/ItemRoulette/ItemRoulette.php +++ b/ItemRoulette/ItemRoulette.php @@ -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);