2012-04-30 2 views
1

Я внедряю систему в тот момент, когда ей нужно выделить число в определенном диапазоне для человека, но не использовать какое-либо число, которое использовалось ранее.
Имейте в виду, что и диапазон номеров, и список исключений будут достаточно большими.Случайное число между 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); 
?> 

Итак, мой вопрос будет, который был бы лучшим вариантом? И есть ли другой (лучший) способ сделать это, чтобы кто-то раньше использовал?

ответ

2

Array проводит большие объемы данных, используя много памяти, не можете ли вы использовать базу данных для хранения этих чисел? Это вообще то, для чего они предназначены.

+0

То, что я думал. Исключенные номера будут в базе данных после их назначения. Я предполагаю, что исходный диапазон может быть таким же, как бы я мог использовать его? Хранить строку на номер с флагом, если он исключен или нет? Несомненно, сохранение всех чисел было бы пустой тратой, если бы они были уже последовательными? – Nick

+0

что-то вроде 'SELECT ... WHERE number NOT IN (4,6,7,8,9,34) ORDER BY RAND()'? –

+0

Вы все еще можете сделать часть 'mt_rand', но просто посмотрите число, сгенерированное в базе данных, а не на' in_array'. У меня будет таблица с одним полем, которое является номером - primary key/mediumint. Это не будет расточительно, если у вас есть настройка полей, правильные базы данных оптимизированы для такого рода материалов. – fire