Я внедряю систему в тот момент, когда ей нужно выделить число в определенном диапазоне для человека, но не использовать какое-либо число, которое использовалось ранее.
Имейте в виду, что и диапазон номеров, и список исключений будут достаточно большими.Случайное число между x и y, исключая диапазон чисел между
Первоначально я думал, что-то делать, как это было бы лучше всего:
<?php
$start = 1;
$end = 199999;
$excluded = array(4,6,7,8,9,34);
$found = FALSE;
while (!$found) {
$rand = mt_rand($start,$end);
if (!in_array($rand,$excluded)) {
$found = TRUE;
}
}
?>
Но я не думаю, что это идеальный вариант, есть возможность бесконечного цикла (или принимать очень долго/вычеркивание сценария).
Я также думал о создании массива всех чисел, которые мне нужны, но, несомненно, массивный массив будет хуже? Кроме того, сделать массив diff на 2 массивные массивы, безусловно, займет много времени? Что-то вроде этого:
<?php
$start = 1;
$end = 199999;
$allnums = range($start,$end);
$excluded = array(4,6,7,8,9,34);
$searcharray = array_diff($allnums,$excluded);
$rand = array_rand($searcharray);
?>
Итак, мой вопрос будет, который был бы лучшим вариантом? И есть ли другой (лучший) способ сделать это, чтобы кто-то раньше использовал?
То, что я думал. Исключенные номера будут в базе данных после их назначения. Я предполагаю, что исходный диапазон может быть таким же, как бы я мог использовать его? Хранить строку на номер с флагом, если он исключен или нет? Несомненно, сохранение всех чисел было бы пустой тратой, если бы они были уже последовательными? – Nick
что-то вроде 'SELECT ... WHERE number NOT IN (4,6,7,8,9,34) ORDER BY RAND()'? –
Вы все еще можете сделать часть 'mt_rand', но просто посмотрите число, сгенерированное в базе данных, а не на' in_array'. У меня будет таблица с одним полем, которое является номером - primary key/mediumint. Это не будет расточительно, если у вас есть настройка полей, правильные базы данных оптимизированы для такого рода материалов. – fire