Php случайное число без повторов

Русские Блоги

Создание не повторяющихся случайных чисел с использованием PHP

Это не что иное, как анализировать, в основном для записи, мы идем прямо к теме.

Первое, что я подумал, что функция RAND (MIN, MAX) генерирует случайное число, фактически использующее mt_rand (min, max), чтобы быстрее сделать случайные числа.

Во-вторых, используйте Array_Unique (ARR), чтобы быть тяжелым, на самом деле использовать array_flip (array_flip (arr)), чтобы быть более быстрым.

Понять выше два очка, мы можем написать немного оптимизированной функции:

/** * Создайте строку, которая не повторяется указанной длиной. * * @Param integer $ min minime. * @Param integer $ max максимум. * @Param integer $ len генерирует длину массива. * * @return array */ function uniqueRandom($min, $max, $len) < if ($min < 0 || $max < 0 || $len) < Бросить новое логическое замечание («неверный параметр»); >if ($max $counter = 0; $result = array(); while ($counter < $len) < $result[] = mt_rand($min, $max); $result = array_flip(array_flip($result)); $counter = count($result); >shuffle($result); return $result; >

На самом деле, вы можете использовать индекс для генерации не повторяющихся случайных чисел, и эффективность — это несколько улиц.

/** * Создайте строку, которая не повторяется указанной длиной. * * @Param integer $ min minime. * @Param integer $ max максимум. * @Param integer $ len генерирует длину массива. * * @return array */ function uniqueRandom2($min, $max, $len) < if ($min < 0 || $max < 0 || $len < 0) < Бросить новое логическое замечание («неверный параметр»); >if ($max if (($max - $min + 2) < $len) < Выбросить новый LoviCexception («входящий диапазон недостаточно для генерации , не повторяющийся случайное число>»); > $index = array(); for ($i = $min; $i < $max + 1; $i++) < $index[$i] = $i; >$startOne = current($index); $endOne = end($index); for ($i = $startOne; $i < $endOne; $i++) < $one = mt_rand($i, $max); if ($index[$i] == $i) < $index[$i] = $index[$one]; $index[$one] = $i; >> return array_slice($index, 0, $len); >

Алгоритм гениальный, чем вышеуказанный алгоритм в:

  1. Случайный, что является случайным, не будет никаких проблем повторения, избегать накладных расходов
  2. Сама замена Array Subscred Smartace является случайным. После удаления каждого случайного случая он исключается в диапазоне, и в следующий раз он будет предпринят только в остальном номере, и выбор случайного числа может быть завершен.
Читайте также:  Python html парсер beautifulsoup

Для эффективности вышеуказанных двух функций вы можете проверить.

Источник

rand без повторений

Вывести без повторений
Здравствуйте. Помогите пожалуйста, никак не могу сообразить как составить запрос чтобы вывести.

Рандом без повторений
<? $max = 11; include "games_array.php"; $RANDOM1 = rand(1,$max); .

Сочетания из n по k без повторений
Здраствуйте. Ситуация у меня такая: Есть неизвестное число элементов в массиве. Их точно больше 1 .

Вывод из базы без повторений
есть БД MESSAGES, в ней имя автора, имя получателя, id сообщения и текст сообщения! Нужно.

Автор FAQ

А откуда функция узнает о $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 минуту
помогите сгенерировать случайные не повторяющиеся числа

Эксперт HTML/CSSЭксперт PHP

$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); //Выводим массив ?>

Источник

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()

Результатом выполнения данного примера будет что-то подобное:

Источник

Генерирование случайных чисел без повторов

Я создаю веб-сайт, который будет случайным образом отображать список визгов каждый раз, когда страница обновляется. Поиск api yelp возвращает 20 записей в массиве. Прямо сейчас я использую функцию rand (0,19) PHP для генерации случайного списка каждый раз, когда страница обновляется ($ business [rand (0,19)]).

Может ли кто-нибудь назвать меня более разумным методом рандомизации? Я хочу показать все 20 списков один раз, прежде чем кто-либо из них будет повторен. Каков предпочтительный метод решения этой проблемы?

ниже ответ не работает, потому что числа воссоздаются каждый раз, когда я обновляю страницу. Я предполагаю, что мне нужно сохранить номера, которые я уже использовал?

$numbers = range(0, 19); shuffle($numbers); 
// Handle Yelp response data $response = json_decode($data); $RANDOM = rand(1,19); $business = $response->businesses; echo "
"; echo $business[$RANDOM]->name."
"; echo "
"; ?>
$numbers = range(1, 20); shuffle($numbers); 
 print_r(randomGen(0,20,20)); //generates 20 unique random numbers ?> 

Аналогичный вопрос: # 5612656

Вы получаете все списки в массиве, называемом $businesses .

  1. Создайте случайный идентификатор списка, используя приведенный выше метод, а затем сохраните его в таблице базы данных.
  2. На каждом обновлении страницы создайте случайный идентификатор листинга и проверьте, соответствует ли оно значению в вашей базе данных. Если нет, отобразите это объявление и добавьте это значение в свою таблицу.
  3. Перейдите к шагу 1.

Когда это будет завершено, вы будете отображать все 20 списков одновременно.

Я бы сохранил запись идентификаторов, которые были отображены в массиве, и убедитесь, что массив не содержит этот идентификатор перед отображением списка.

Источник

Рандом без повторений

Вывести без повторений
Здравствуйте. Помогите пожалуйста, никак не могу сообразить как составить запрос чтобы вывести.

Сочетания из n по k без повторений
Здраствуйте. Ситуация у меня такая: Есть неизвестное число элементов в массиве. Их точно больше 1 .

Вывод из базы без повторений
есть БД MESSAGES, в ней имя автора, имя получателя, id сообщения и текст сообщения! Нужно.

Я так понял, чтобы не повторялись при перезагрузке страницы? Создайте массив в сессии и помещайте туда все сгенерированные числа. При следующей генерации, проверяете, не находится ли это число в массиве. Если находится, генерите еще раз.
И не забудьте очистить массив при достижении в нем элементов ($max-$min), а то улетите в вечный цикл

Если вам надо просто сгенерить 4 случайных числа без повторений в одном http запросе, то поступаете также, но без сессии) И очищать массив не надо, если конечно $max >= 4

$numbers = []; while (count($numbers)  4) $numbers[$numb] = ($numb = rand(0, 11)); $values = array_values($numbers); print_r( $values );

VNIIAEN, поясните мне, убогому, как тут проверка на повторения происходит? а то я не могу альтернативный синтаксис прочитать внутри цикла

Сынок, в теле цикла while() происходит наполнение массива $numbers таким образом, что на каждой итерации генерируется случайное число, которое и сохраняется в массив в виде пары ключ=>значение. Если такой ключ в массиве уже есть, то он будет перезаписан, и соответственно в массив не будет добавлен новый элемент, а будет изменён существующий. После этого в условии цикла проверяется количество элементов, если их меньше 4, запускается следующая итерация.

Весь фокус в том, что массивы не могут содержать одноимённые ключи.

Источник

Оцените статью