Генерация уникальных случайных чисел в диапазоне — PHP
Я знаю, что этот код плохой, поэтому мне нужен лучший оптимизированный код моей версии! помощь! Пример: если мне нужно сгенерировать 3 числа в пределах от 1 до 15, они должны быть похожими на 5, 9, 1, но не 3,1,2 [с в 1 — 3 (числа, которые я хочу создать)]
Уникальное случайное число? «Уникальный номер» и «случайное число» не могут сосуществовать. Думаю об этом. Вы можете иметь уникальный. Или вы можете иметь случайный. Какой ты хочешь?
13 ответов
Массив с диапазоном чисел в случайном порядке:
$numbers = range(1, 20); shuffle($numbers);
function UniqueRandomNumbersWithinRange($min, $max, $quantity)
Array ( [0] => 14 [1] => 16 [2] => 17 [3] => 20 [4] => 1 )
Хорошая точка зрения. Сделайте это в функцию и отправьте ее для включения в массивную базу данных функций PHP;)
если я пытаюсь сгенерировать 3 числа с вашей функцией, они похожи на 1, 3, 2, но я хочу что-то вроде 1, 5, 15 [если предел 1-15]
Не очень хороший выбор, если вы хотите высокие случайные числа. Подумайте, сколько времени понадобится этой функции, чтобы сгенерировать 30 рандовых чисел от 1 до 50k. Сначала он создаст массив с 50 тысячами целых чисел, затем попытается перемешать каждое из них, а затем начнет нарезать еще 50 тысяч.
$len = 10; // total number of numbers $min = 100; // minimum $max = 999; // maximum $range = []; // initialize array foreach (range(0, $len - 1) as $i) < while(in_array($num = mt_rand($min, $max), $range)); $range[] = $num; >print_r($range);
Мне было интересно увидеть, как принятый ответ складывается против моего. Полезно отметить, что гибрид обоих может быть выгодным; на самом деле функция, которая условно использует тот или иной в зависимости от определенных значений:
# The accepted answer function randRange1($min, $max, $count) < $numbers = range($min, $max); shuffle($numbers); return array_slice($numbers, 0, $count); ># My answer function randRange2($min, $max, $count) < $range = array(); while ($i++ < $count) < while(in_array($num = mt_rand($min, $max), $range)); $range[] = $num; >return $range; > echo 'randRange1: small range, high count' . PHP_EOL; $time = microtime(true); randRange1(0, 9999, 5000); echo (microtime(true) - $time) . PHP_EOL . PHP_EOL; echo 'randRange2: small range, high count' . PHP_EOL; $time = microtime(true); randRange2(0, 9999, 5000); echo (microtime(true) - $time) . PHP_EOL . PHP_EOL; echo 'randRange1: high range, small count' . PHP_EOL; $time = microtime(true); randRange1(0, 999999, 6); echo (microtime(true) - $time) . PHP_EOL . PHP_EOL; echo 'randRange2: high range, small count' . PHP_EOL; $time = microtime(true); randRange2(0, 999999, 6); echo (microtime(true) - $time) . PHP_EOL . PHP_EOL;
randRange1: small range, high count 0.019910097122192 randRange2: small range, high count 1.5043621063232 randRange1: high range, small count 2.4722430706024 randRange2: high range, small count 0.0001051425933837
Если вы используете меньший диапазон и более высокий счет возвращаемых значений, принятый ответ, безусловно, оптимален; однако, как я и ожидал, большие диапазоны и меньшие подсчеты займет много времени с принятым ответом, так как он должен хранить все возможные значения в диапазоне. Вы даже рискуете выбросить крышку памяти PHP. Гибрид, который оценивает соотношение между диапазоном и количеством и условно выбирает генератор, был бы лучшим из обоих миров.
rand
При вызове без параметров min и max , возвращает псевдослучайное целое в диапазоне от 0 до getrandmax() . Например, если вам нужно случайное число между 5 и 15 (включительно), вызовите rand(5, 15) .
Функция не создаёт криптографически защищённые значения и не должна использоваться для криптографических целей или целей, требующих, чтобы возвращаемые значения были недоступны для разгадывания.
Если требуется криптографически безопасная случайная последовательность, Random\Randomizer может использоваться с движком Random\Engine\Secure . Для простых случаев использования функции random_int() и random_bytes() предоставляют удобный и безопасный API, поддерживаемый CSPRNG операционной системы.
Замечание: На некоторых платформах (таких как Windows) getrandmax() всего лишь 32767. Чтобы расширить диапазон, используйте параметры min и max , или обратитесь к функции mt_rand() .
Замечание: Начиная с PHP 7.1.0, rand() использует тот же алгоритм получения случайных чисел, что и mt_rand() . Для сохранения обратной совместимости, функция rand() позволяет задавать параметр max меньше, чем параметр min . Функция mt_rand() в такой ситуации будет возвращать false
Список параметров
Наименьшее значение, которое может быть возвращено (по умолчанию: 0)
Наибольшее значение, которое может быть возвращено (по умолчанию: getrandmax() )
Возвращаемые значения
Псевдослучайное значение в диапазоне от min (или 0) до max (или getrandmax() ).
Список изменений
Примеры
Пример #1 Пример использования rand()
Результатом выполнения данного примера будет что-то подобное:
Неповторяющийся рандом PHP
Как обычно почти каждый день мне приходится писать какой нибудь код на том или ином языке программирования, сегодняшний день не стал исключением. Сегодня мне потребовалось из своего компонента магазина вывести на главную страницу товары случайным образом. Ни чего сложного в этом нет, подумал я, и вспомнил про php функцию rand(). Но на пол пути к написанию кода я сообразил что товары на главной странице могут повторятся (особенно если в магазине небольшое колличесвто товара), а это меня не устраивает.
После этого я решил набросать свою небольшую пользовательскую функцию которая бы исключала повторение случайного числа. После пары минут функция была готова, сообственно ее я вам и хочу представить. Сложного в ней ничего нет, но новичку может пригодится данная функция в плане идеи реализации и конечно же в плане повторения php.
function unic_rnd($start, $end, $count) $array_r =array();
$i=-1;
while($i++ <$count)$rnd = rand($start, $end);
if(!in_array($rnd, $array_r)) $array_r[] = $rnd;
>
else $count=$count+1;
>
>
return $array_r;
>
Функция принимает 3 параметра. Первый параметр это как и у функции rand() это — минимальное генерируемое число, второй по аналогии — максимальное генерируемое число, а вот третий параметр это колличество случайных неповторяющихся чисел которое нам понадобится.
Алгоритм работы функции довольно прост, в цикле генерируем случайное число и добавляем его в массив при условии что в массиве нету такого же числа. Если такое число существует то его не добавляем в массив и добавляем циклу еще одну интерацию.
Пример использования функции таков:
На выходе мы получаем массив с необходимым колличеством рандомных неповторяющихся чисел:
Так же могу предложить использовать в функции вместо rand() функцию mt_rand() на сколько помню она поновее и побыстрее. Вот собственно и все!
rand без повторений
Вывести без повторений
Здравствуйте. Помогите пожалуйста, никак не могу сообразить как составить запрос чтобы вывести.
Рандом без повторений
<? $max = 11; include "games_array.php"; $RANDOM1 = rand(1,$max); .
Сочетания из n по k без повторений
Здраствуйте. Ситуация у меня такая: Есть неизвестное число элементов в массиве. Их точно больше 1 .
Вывод из базы без повторений
есть БД MESSAGES, в ней имя автора, имя получателя, id сообщения и текст сообщения! Нужно.
А откуда функция узнает о $randmass? Он используется в третьей строке, но ранее не объявляется и не откуда не берется.
Надо передавать его в функцию
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
function my_random ($min, $max, $randmass) { $randomize = rand($min,$max); if(preg_match("/;$randomize;/",$randmass)){ my_random($min, $max, $randmass); }else{ $randmass .= ';'.$randomize.';'; return array('rand' => $randomize, 'massive' => $randmass); } } for($i=1;$i16;$i++){ $rand = my_random(1,25,$randmass); $randy = $rand['rand']; $randmass = $rand['massive']; $post .= '&qs_'.$i.'='.$randy.''; print_r($rand); }
тут в каком то месте $randmass обнуляется почему-то
Добавлено через 2 минуты
и вообще чисел не 15 теперь. Я запутался
Добавлено через 1 минуту
помогите сгенерировать случайные не повторяющиеся числа
$numbers = range($min, $max); shuffle($numbers); return array_pop($numbers);
KOPOJI, тут тонкий момент. Если я, конечно, правильно всё понял.. Хотя, может туплю просто вечером =\
Если я хочу 15 случайных чисел от 0 до 100, то не выходит каменный цветок =(
Поправь, если я не прав, могу ошибаться о_О
Вот кривоватенький вариантик:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
$randCount = 15; //Количество элементов массива $randMin = 0; //Минимальное рандомное число $randMax = 100; //Максимальное рандомное число $randArray = array(); //Инициализируем массив /** * Цикл будем повторять до упора. * Важно! Если rage (интервал), между $randMin и $randMax * будет меньше $randCount, цикл будет бесконечным! * Это очень важное замечание, так что решение "не для всех" * Однако, снабжено комментариями ;) */ while (true) { //Погнали $rand = rand($randMin, $randMax); //Формируем рандомное число if (!in_array($rand, $randArray)) { //Если такого числа в массиве нет $randArray[] = $rand; //Добавляем его if (sizeof($randArray) + 1 == $randCount) { //Если массив заполнен до упора break; //Выходим из цикла } } } print_r($randArray); //Выводим массив ?>
PHP. Получить 20 уникальных, неповторяющихся значений
Данный материал предоставлен сайтом PacificSky.Ru исключительно в ознакомительных целях. Администрация не несет ответственности за его содержимое.
Для достижения цели воспользуемся циклом while.
Переменная $count будет хранить выполненное количество итераций.
Создадим результирующий массив, в который в дальнейшем будет производиться запить созданных значений.
Ни смотря на то, что число произвольное, ни кто не гарантирует, что оно не могло повториться ранее.
По этому при каждой итерации, внутри цикла необходима проверка на существование нового числа в массиве.
Для этого нам потребуется функция in_array, в которую первым параметром передается значение, которое мы будем искать в массиве, вторым параметром передается сам массив по которому будет производиться поиск.
И если значение не найдено в массиве, то оно будет удовлетворять условию и будет записано в результируюий массив.
if (!in_array($rand, $resultArray)) {
Таким образом У нас получается цикл, который будет повторен 20 раз.
На каждой итерации будет сгенерировано произвольное значение и записано в переменную $rand.
Далее с помощью функции in_array будет производиться поиск в результирующем массиве.
И если нового значений не будет обнаружено, то произвольно сгенерированное число будет записано в результирующий массив:
Таким образом цикл будет повторяться, пока переменная $ccount не достигнет отметки 20.
Хочу сказать, что 20 это число приведенное для данной статьи. Вы в свою очередь можете задать совершенно любое значение, которое вам потребуется.(От этого зависит количество сгенерированных значений в результирующем массиве)
После выполнения цикла массив будет содержать 20, произвольных, уникальных, не повторяющихся, сгенерированных значения.
array(20) { [0]=> int(1449204470) [1]=> int(332461299) [2]=> int(204147641) [3]=> int(1802503248) [4]=> int(1432769999) [5]=> int(26986478) [6]=> int(1999132883) [7]=> int(1132471797) [8]=> int(744921555) [9]=> int(437875722) [10]=> int(1994734701) [11]=> int(1720130100) [12]=> int(1077114615) [13]=> int(285350088) [14]=> int(1382348075) [15]=> int(1412562980) [16]=> int(208278908) [17]=> int(1079845401) [18]=> int(736728636) [19]=> int(1992854708) >