[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Генератор случайных чисел
Bezdna
Сваял тут генератор случайных чисел, в принципе работает, но смущает один момент - иногда вместо заданного количества чисел выдаёт меньшее их количество. Ткнёт кто-нибудь туда, где я неправ?



$end = 1000;
$quantity = 10;

function uniq_chars($end, $quantity) {

$xx = 1;
do {
$mt[] = mt_rand(1, $end);
$mx = array_values(array_unique($mt));

$zz = (count($mx) < $quantity) ? $quantity + 1 : $quantity;
} while($xx++< $zz);

return $mx;
}
Valick

function uniq_chars($start, $end, $quantity = 1)
{
$result = [];
do {
$rand = mt_rand($start, $end);
if (!in_array($rand, $result)) {
$result[] = $rand;
}
}
while ($quantity > count($result));
return $result;
}
echo '<pre>';
print_r(uniq_chars(1,1000, 10));
echo '</pre>';


_____________
Стимулятор ~yoomoney - 41001303250491
Bezdna
Valick, за код спасибо, но, всё-таки, интересно - почему вместо необходимых 10 цифр иногда получается 9, хотя вроде всё правильно?
Valick
Bezdna, ты ошибаешься, в коде нет ничего правильного))
Можешь объяснить вот эту строку?
$zz = (count($mx) < $quantity) ? $quantity + 1 : $quantity;

_____________
Стимулятор ~yoomoney - 41001303250491
FatCat
Мне сама логика делать через array_unique не понятна.
Вот моя логика:
Если нам нужен массив длинной в 10 элементов, это условие цикла.
В цикле in_array проверяет, чтобы не дублировались.
Код будет и короче, и понятнее.

_____________
Бесплатному сыру в дырки не заглядывают...
Michael
Я бы не использовал ++ и сравнение, оно запутывает. Инкремент произойдет уже после сравнения.

$x = 1;

print (int)($x++ > 1); // 0, т.е. false


_____________
There never was a struggle in the soul of a good man that was not hard
killer8080
имена функций и переменных должны быть "говорящими", uniq_chars интуитивно воспринимается как функция возвращающая набор уникальных символов,вместо этого она возвращает набор случайных чисел blink.gif
Цитата (Bezdna @ 27.06.2021 - 00:49)
но, всё-таки, интересно - почему вместо необходимых 10 цифр иногда получается 9

потому что $xx увеличивается на каждой итерации цикла, а размер массива $mx не всегда.
Valick
Цитата (killer8080 @ 27.06.2021 - 21:06)
имена функций и переменных должны быть "говорящими"

полностью поддерживаю предыдущего оратора


Bezdna, чуток разукрасил код

просто добавь воды



/**
*
@param array $conditions
*
*
@return bool
*
@throws Exception
*/

function checkParameters(array $conditions): bool
{
$result = false;
$error = [];
foreach ($conditions as $condition => $message) {
eval("\$result = $condition;");
if ($result) {
$error[] = $message;
}
}

if (!empty($error)) {
array_unshift($error, 'Невалидные аргументы функции:');
throw new Exception(implode(PHP_EOL, $error));
}
return true;
}

/**
* Возвращает массив уникальных случайных чисел
*
*
@param int $start - начальное значение диапазона числа
*
@param int $end - конечное значение диапазона числа
*
@param int $quantity - количество элементов возвращаемого массива
*
*
@return array
*
@throws Exception
*/

function getUniqueRandomList(int $start, int $end, int $quantity = 1): array
{
checkParameters([
"empty($end)" => 'Значение ($end) не может быть нулём',
"$start >= $end" => 'Значение ($end) должно быть больше значения ($start)',
"$quantity < 1" => 'Значение ($quantity) длжно быть больше нуля',
]);


$result = [];
do {
$rand = mt_rand($start, $end);
if (!in_array($rand, $result)) {
$result[] = $rand;
}
}
while ($quantity > count($result));
return $result;
}

try {
echo '<pre>';
print_r(getUniqueRandomList(1,1000, 10));
echo '</pre>';
} catch (Exception $e) {
echo $e->getMessage();
}


_____________
Стимулятор ~yoomoney - 41001303250491
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.