php перемешать массив в случайном порядке

shuffle

(PHP 4, PHP 5, PHP 7, PHP 8)

shuffle — Перемешивает массив

Описание

Эта функция перемешивает элементы массива в случайном порядке. Используется псевдослучайный генератор случайных чисел, следовательно данная функция не подходит для задач криптографии.

Список параметров

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

ВерсияОписание
7.1.0Внутренний алгоритм получения случайных чисел изменён с функции rand библиотеки libc на генератор на базе » Вихря Мерсена.

Примеры

Пример #1 Пример использования shuffle()

Примечания

Смотрите также

User Contributed Notes 21 notes

shuffle for associative arrays, preserves key=>value pairs.
(Based on (Vladimir Kornea of typetango.com)’s function)

return true ;
>
?>

*note: as of PHP 5.2.10, array_rand’s resulting array of keys is no longer shuffled, so we use array_keys + shuffle.

Shuffle associative and non-associative array while preserving key, value pairs. Also returns the shuffled array instead of shuffling it in place.

/* And the result is:
Array ( [0] => Array ( [Name] => Ask [URL] => www.ask.com [Usage] => Asking Jeeves ) [1] => Array ( [Name] => Google [URL] => www.google.com [Usage] => Googling ) [2] => Array ( [Name] => Yahoo [URL] => www.yahoo.com [Usage] => Yahooing? ) )
*/
?>

Hope you find it useful!

If you want the Power Set (set of all unique subsets) of an array instead of permutations, you can use this simple algorithm:

Another shuffle() implementation that preserves keys, does not use extra memory and perhaps is a bit easier to grasp.

Источник

Перемешивание многомерного массива

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Обратимое перемешивание массива
Здравствуйте! Хочу написать функцию, которая будет перемешивать массив с помощью числа сида. В.

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

php перемешать массив в случайном порядке. Смотреть фото php перемешать массив в случайном порядке. Смотреть картинку php перемешать массив в случайном порядке. Картинка про php перемешать массив в случайном порядке. Фото php перемешать массив в случайном порядкеСортировка многомерного массива
Есть многомерный массив вида array( array(=>1 =>text =>1) array(=>1 =>text =>1).

Решение

Немного не осилил, работает вроде и с function(&$x) и с function($x)
Не смог выбрать первое или второе )

Добавлено через 5 минут

Добавлено через 11 минут

x_lab, Тихий поп, Спасибо.

Добавлено через 5 часов 42 минуты
Собрал такое.

Потому-что этот код выполняется как-бы два раза.
Первый при выводе формы, и второй при получении данных.
Изменённые при первом выполнении данные нужно где-то хранить, чтобы затем сверять с получаемыми.

Скорее на сервере, возможно сессии

php перемешать массив в случайном порядке. Смотреть фото php перемешать массив в случайном порядке. Смотреть картинку php перемешать массив в случайном порядке. Картинка про php перемешать массив в случайном порядке. Фото php перемешать массив в случайном порядке

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Генерация многомерного массива
Задача сгенерировать многомерный массив, вот такого вида: Array ( => Array (.

php перемешать массив в случайном порядке. Смотреть фото php перемешать массив в случайном порядке. Смотреть картинку php перемешать массив в случайном порядке. Картинка про php перемешать массив в случайном порядке. Фото php перемешать массив в случайном порядкеПеремешивания многомерного массива
Здравствуйте, господа! Перемешать обычный массив просто. А как быть с более сложными? Например.

Источник

Website-create.ru

Сегодня мы рассмотрим две функции, применяемые к массивам в php. При помощи одной функции мы сможем перевернуть массив, то есть первый его элемент станет последним, а последний первым и т.д. При помощи второй функции мы перемешаем значения массива так, чтобы они расположились в случайном порядке.

Эти действия вполне могут Вам пригодиться при решении различных задач программирования, так что давайте познакомимся с данными функциями.

Работать с ними совершенно не сложно, так что данный пост будет достаточно коротким. Однако, есть и некоторые нюансы, который нужно будет учесть.

Ну что ж, давайте начнем с переворачивания массива.

Переворачивание массива в php

Чтобы перевернуть массив, познакомимся с функцией array_reverse(). После применения данной функции к определенному массиву, мы получим массив, элементы которого будут следовать в обратном порядке относительно исходного массива.

А протестировать работу данной функции достаточно просто: нам следует объявить массив, применить к нему данную функцию, после чего можно вывести результат на экран, чтобы убедиться, что элементы расположились в обратном порядке.

Результат, как мы можем видеть из скриншота, именно тот, которого мы и ожидали: последний элемент стал первым, предпоследний – вторым и т.д.

Мы проделали переворачивание с массивом-списком. А как же насчет ассоциативных массивов? Ведь в них значения элемента привязано к ключу!

И ассоциативные массивы можно спокойно переворачивать, при этом их связь с ключом не потеряется.

Давайте рассмотрим это на простом примере.

Из результата выполнения данного кода (скриншот справа) можно видеть, что массив прекрасно перевернулся, но связь элементов с их ключами при этом не потеряна.

Перемешивание массива в php

Также мы можем перемешать элементы массива случайным образом. Для этого существует специальная функция shuffle().

Ее применение достаточно простое. Однако, здесь нужно запомнить один небольшой нюанс: если Вы будете применять функцию к ассоциативному массиву, то в результате получите данный массив в виде списка. То есть значения элементов массива будут перемешаны, но связь ключ-значение уже не сохранится. Результатом будет массив-список.

Давайте рассмотрим на примерах.

Для начала я перемешаю значения элементов обычного массива-списка:

А вот и результат! Как Вы видите, значения элементов массива расположились в случайном порядке. Причем, если Вы будете обновлять страницу, то результат будет меняться.

Теперь давайте тоже самое проделаем с ассоциативным массивом:

Значение элементов массива также перемешалось случайным образом, но здесь мы уже не можем наблюдать связи ключ-значение. Массив возвращен, как список.

Вот об этом нюансе перемешивания, пожалуйста, не забывайте.

И это все, о чем я хотела рассказать Вам в этом небольшом посте. Надеюсь информация была Вам полезной, и, если Вы работаете с массивами php, то рано или поздно она Вам пригодится.

Добавляйте страничку в закладки, чтобы можно было всегда к ней вернуться и еще раз посмотреть, как работать с массивами. Также читайте другие посты, посвященные массивам php… и не только. Ссылки Вы можете видеть ниже.

Жду Ваших комментариев! Делитесь постом с друзьями при помощи социальных кнопок, которые расположены ниже, а также подписывайтесь на обновления, чтобы всегда быть в курсе новых статей и уроков.

С Вами была Анна Котельникова.

Успехов Вам и до скорых встреч в следующих публикациях!

Источник

Алгоритмы перемешивания

Существуют ли алгоритмы перемешивания массива способные удивить? В статье будут рассмотрены наиболее популярны алгоритмы перемешивания.

Есть целочисленный массив размером 100 и значениями от 1 до 100.

Самый простой, надежный и качественный алгоритм в теории это:

Суть алгоритма в том, чтобы не делать лишних операций и перемешать абсолютно все элементы.

1. Берется пустой массив — a. Берется массив для буфера — b. Массив b заполняется значениями от 1 до 100 в соответствии с индексом элемента.

2. Цикл проходит от 1 до 100 присваивая элементу массива a[i] значение случайного элемента из массива b.

3. Затем из массива b удаляется присвоенный массиву a элемент.

Например: значение массива b было = 1 2 3 4 5. Присвоили 3-й элемент массиву a и удаляем это значение из массива b. В итоге массив b стал = 1 2 4 5.

1. Алгоритм, который продемонстрирован выше. Этот алгоритм проходит от 1 до 100, заполняет основной массив случайным элементом из буферного массива, из которого удаляются уже использованные элементы.
// проходит один раз, перемешивает гарантированно все, использует второй массив;

Другие алгоритмы:
2. Алгоритм, который меняет местами два элемента и это повторяется нужное количество раз.
// повторяется много раз, перемешивает не все, простота реализации;

3. Пробегаемся по всем элементам слева от первого до последнего и меняет текущий элемент со случайным элементом из правой части местами. (по сути 1 способ, только подход другой)
//проходит один раз, перемешивает гарантированно все, возможна многократная перезапись одного элемента;

4. Постоянно генерировать случайное число из заданного диапазона и сравнивать с уже полученными ранее, если оно уникально — вычисляем следующее.
// может вычислять очень долго, делает много лишних операций, перемешивает все — худший из всех приведенных, в теории может зависнуть;

Дорогие читатели, давайте узнаем — есть ли алгоритмы лучше и надежнее? Интереснее? Напишите в комментариях.
Тут язык не имеет значения, хотя если есть интересные реализации в специфических языках — напишите, пожалуйста, в комментариях.

Источник

Пятничный JS: случайное перемешивание

Экзамен в школе прапорщиков.
— Вот смотрите. Это большой палец, это — указательный, это — средний, это — безымянный, это — мизинец. Мешаем, мешаем, мешаем (двигает пальцами)… Теперь где какой?

Перед моими студентами регулярно встаёт задача случайного перемешивания массива. За её решением они, как правило, лезут в гугл. И гугл им подсказывает следующее:

Здесь и далее будем называть этот метод случайной сортировкой. Сегодня я решил написать о том, какие преимущества и недостатки есть у такого подхода.

Как это вообще работает?

Метод sort у джаваскриптовых массивов в качестве аргумента принимает функцию-компаратор. Эта функция должна принимать два элемента массива и возвращать число. Если число положительное, алгоритм сортировки считает, что первый элемент больше; если отрицательное — значит, первый элемент меньше; если же компаратор возвращает нуль, то в рамках данной сортировки элементы как бы равны. Если под видом компаратора передать функцию, которая будет возвращать положительное или отрицательное число случайным образом, то массив окажется отсортирован в «случайном» порядке.

Преимущества

Такое перемешивание очень быстро пишется. Я честно пытался придумать какое-нибудь ещё преимущество, но мне не удалось.

Недостатки

Этот параграф будет несколько длиннее, потому я разобью его на подпараграфы.

Несоответствие спецификации

If comparefn is not undefined and is not a consistent comparison function for the elements of this array (see below), the sort order is implementation-defined.

В переводе с технического английского на русский разговорный это означает, что если компаратор не отвечает некоторым очевидным требованиям (ниже в спецификации разъясняется, что, в частности, он должен для одних и тех же аргументов всегда возвращать одно и то же значение), то порядок сортировки зависит от реализации конкретного джаваскриптового движка. То есть, фактически, не определён. Разработчик браузера имеет, например, полное право сделать так, что при обнаружении того, что компаратор «ненастоящий», возвращается исходный массив без каких-либо перестановок. И это будет полностью соответствовать спецификации. То, что во всех существующих браузерах приведённый метод даёт нечто похожее на случайное перемешивание — не более чем счастливое совпадение.

Временна́я сложность

Корректный алгоритм перемешивания (см. ниже) имеет временную сложность O(n). Попросту говоря, это означает примерно следующее: если длина массива увеличится в 10 раз, то продолжительность его перемешивания также увеличится в 10 раз.

Самые быстрые алгоритмы сортировки имеют временную сложность O(n*log(n)). Это означает, что при увеличении длины массива в 10 раз продолжительность его перемешивания увеличится более чем в 10 раз.

В сумме эти два факта значат вот что: для достаточно большого массива перемешивание случайной сортировкой будет работать медленнее, чем «правильное» перемешивание (даже если для маленьких массивов это было не так). И чем больше массив, тем больше разница во времени выполнения.

Почему я сделал оговорку в скобках? Потому что Array#sort выполняется нативным кодом, и за счёт этого на небольших массивах потенциально может оказаться быстрее. У него может оказаться меньше константный множитель, сказал бы человек, знакомый с О-нотацией.

Ненастоящая случайность

Те, кто хотя бы поверхностно знаком с теорией вероятностей, знают, что случайность случайности рознь. Монетка может выпасть орлом или решкой, кубик может выпасть шестёркой или не шестёркой. И там, и там имеют место случайные события, однако в первом случае события равновероятны, а во втором нет.

Перемешивание массива называется истинно случайным, если все возможные перестановки его элементов имеют одинаковую вероятность. Именно этим свойством случайная сортировка не обладает, и я покажу это на практике.

Я набросал следующую страничку. На ней находятся две диаграммы, одна соответствует случайному перемешиванию, вторая — случайной сортировке. Впрочем, вы сейчас видите не диаграммы, а квадратики, разбитые на клеточки различных оттенков серого. Чтобы они стали диаграммами, нужна легенда — объяснение, что эти клеточки и их цвета означают. Всё очень просто. Мы несколько раз (в данном случае несколько = 10000) берём массив чисел от 0 до n (в данном случае n = 32) и случайно перемешиваем тем или иным алгоритмом. Затем мы вычисляем частоты, с которыми то или иное число оказывается на том или ином месте. Соответственно, цвет клетки в строке номер i и столбце номер j показывает, насколько часто число i оказывается на месте j. Чёрный цвет означает, что оно там не оказывается никогда, белый — что оно там оказывается вдвое или более чаще, чем положено. Если число попадает на указанное место с теоретически предсказанной частотой 1/n, клетка будет иметь цвет hsl(0, 0%, 50%) — оттенок серого, расположенный в точности посередине между чёрным и белым.

Если вы используете свежую версию браузера Chrome, вы видите, что в квадрате справа много белых или почти белых клеток, расположенных по определённой закономерности. Это означает, что при случайной сортировке определённые элементы имеют тенденцию оказываться в определённых местах. Плохо ли это? Зависит от того, для чего вы используете перемешивание. Если для каких-то косметических эффектов, то, возможно, ничего страшного. Если вам важно, чтобы пользователь не мог предсказать, какой элемент окажется на каком месте, или если закономерности в перемешивании каким-то образом заметны визуально — то плохо. И упаси вас Гермес использовать такое перемешивание для чего-то, связанного с криптографией.

Upd: товарищ mk2 заметил, что равномерно-серым квадрат в Firefox будет только при размере, равном степени двойки. Нужно больше таких внимательных товарищей, товарищи!

Upd2: товарищи Stalker_RED и yaZva не поленились (в отличие от меня) сделать скрины в различных браузерах.

Напоследок добавлю, что вот эти мои диаграммы с пятьюдесятью оттенками серого — не критерий, а признак. Из того, что квадрат получился не серый, следует, что сортировка не равномерна, однако неверно обратное. Контрпример — циклический сдвиг на случайную величину. Частоты попадания элементов на места будут совершенно одинаковы, однако ни о какой истинной случайности перемешивания, разумеется, не может быть и речи.

Upd3: в этой ветке обсуждается, почему случайная сортировка не даёт равномерную случайность в Firefox (причём даже в том случае, если по диаграмме кажется, что даёт).

Как правильно?

Истинные джедаи используют одну из вариаций алгоритма Фишера-Йетса. Для своей демки я реализовал его так:

Суть алгоритма, если перевести с JS на русский, следующая: берём последний элемент и меняем его местами со случайно выбранным элементом не правее его (в том числе, возможно, и с ним самим). Затем повторяем ту же операцию для предпоследнего элемента, потом для предпредпоследнего и так далее. Вуаля! (этим словом с JS на русский переводится «return arr;»).

Настало время безумия

Кто-то из читателей ждал этого целую статью, остальные, в принципе, могут этот параграф не дочитывать. Я задался вопросом: можно ли написать такую функцию compare, что arr.sort(compare) даст истинно случайную перестановку? Ответ: можно, но с определёнными оговорками. Первая — функцию надо перед каждой сортировкой создавать заново. Вторая — в массиве не должно быть одинаковых элементов. Итак, узрите:

Это работает следующим образом: при создании компаратор через замыкание получает доступ к массиву cache. Каждый раз, когда ему передаются аргументы, он кладёт их в cache на случайные места (если их там ещё нет), а затем считает, что тот элемент, который в cache стоит правее, будет больше. То есть по сути в массиве cache постепенно строится тот случайный порядок, в котором элементы должны стоять, а метод sort постепенно приводит исходный массив в соответствии с этим порядком. Если же в нём окажутся равные элементы (равные с точки зрения оператора ===, если мы сортируем объекты — то всё хорошо, даже если у них одинаковое содержание. !== ), они, к сожалению, будут идти подряд.

На этом всё. Спасибо за чтение, надеюсь, вам было познавательно, и особенно надеюсь, что я убедил вас не использовать случайную сортировку почти никогда. Приятного грядущего вечера.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *