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