Перемешать массив случайным образом
(PHP 3 >= 3.0.8, PHP 4, PHP 5)
shuffle — Перемешать массив
Описание bool shuffle ( array &array )
Эта функция перемещает элементы массива в случайном порядке.
Пример 1. Пример использования shuffle()
FPublisherWeb-технологии: База знанийJavaScript скриптыКак перемешать массив случайным образом?Размещена 3 сентабря, 2008 года Если нужно перемешать эелементы массива в случайном порядке, то . это придется сделать самим, в Javascript нет функции shuffle такой как в PHP: Последние поступления:ТехЗадание на ЗемлюРазмещена 14 марта 2020 года Пpоект Genesis (из коpпоpативной пеpеписки) Шпаргалка по работе с VimРазмещена 05 декабря 2020 года Vim довольно мощный редактор, но работа с ним не всегда наглядна. Ошибка: Error: Cannot find a val >Размещена 13 сентабря 2020 года
Если возникает ошибка на centos 5 вида Linux OptimizationРазмещена 30 июля 2012 года PowerCodX BlogPortal despre sfera tehnologiilor informaționale C# — Перемешать Массив
Здравствуйте дорогие программисты. В этой статье вы узнаете как перемешать массив или как получить массив неповторяющихся чисел. Введение: Дело было вечером. Писал я маленькую программку, чисто для себя, чтобы попрактиковаться и получить новые навыки. Так как я программист на любительском уровне, знания в области программирования очень приветствуется. Так вот, писал я код и на какой-то момент мне мне было необходимо перемешать массив с разными числами так чтобы они были не повторялись. В Google я нашел ответ на свой вопрос. Итак, чтобы перемешать массив достаточно писать 3-х строчный код: Действительно код заработал, но я хотел узнать как алгоритм работает. Я попытаюсь вам объяснить как он работает. В первой строке вам должно быть все понятно, здесь инициализируется целочисленный массив с числами от 1 до 10. Во второй строке инициализируется генератор псевдослучайных чисел, т.е. генератор который выдает случайные числа. А почему мы передали Random’у в качестве seed время в милисекундах (DateTime.Now.Millisecond)? Как я понял именно привязка к времени дает нам случайные неповторяющиеся числа. Вот здесь самый смак :). Именно здесь я не понимал как происходит перемешивание чисел, но в конце-концов добился результатов и понял(не уверен если правильно) как происходит перемешивание массива. Кто не знает это LINQ запрос. Объяснить что это такое я не буду, так как сделать за меня может Wikipedia. Массив(1) отжог! тогда я тоже сумничаю: >>> import random |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Riki_tiki_tavi | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Riki_tiki_tavi | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Riki_tiki_tavi
Допустим имеем одномерный массив с 1..n количеством элементов. 1) Находим произвольное число мешаний массива — к. Это число не менее Окр(n*(n/2)), но не более n*2 — для ускорения. 2) вычисляем массив случайных чисел от 1 до к. Числа должны быть 1..n 3) значения в массиве случайных числе будут определять какие значения в исходном массиве у нас будут меняться местами Как случайные (перемешать) массив JavaScript?У меня есть такой массив: Как я могу перемешивать / перемешать? 30 ответовде-факто беспристрастным алгоритмом перемешивания является перемешивание Фишера-Йейтса (он же кнут). дополнительная информация об алгоритме используется. вот реализация JavaScript Durstenfeld shuffle, компьютерно-оптимизированная версия Fisher-Yates: алгоритм Фишера-Йейтса работает, выбирая один случайный элемент для каждого исходного элемента массива, а затем исключая его из следующего розыгрыша. Так же, как случайный выбор из колоды карт. это исключение сделано умным способом (изобретенным Durstenfeld для использования компьютерами) путем замены выбранного элемента на текущий элемент, а затем выбор следующего случайного элемента от остальных. Для оптимальной эффективности цикл работает назад, так что случайный выбор упрощается (он всегда может начинаться с 0), и он пропускает последний элемент, потому что больше нет других вариантов. время работы этого алгоритма равно O (n). Обратите внимание, что перетасовка выполняется на месте. Поэтому, если вы не хотите изменять исходный массив, сначала сделайте его копию с помощью .slice(0) . обновление до ES6 / В ECMAScript 2015новый ES6 позволяет назначать сразу две переменные. Это особенно удобно, когда мы хотим поменять значения двух переменных, так как мы можем сделать это в одной строке кода. Вот более короткая форма той же функции, используя эту функцию. [community edit: этот ответ неверен; см. комментарии. Его оставляют здесь для дальнейшего использования, потому что идея не такая уж редкая.] можно (или нужно) использовать его как прототип из массива: использовать подчеркивание.библиотека js. Метод _.shuffle() хорошо для этого случая. Вот пример с методом: короче и, вероятно, * быстрее Fisher-Yates shuffle алгоритм
размер скрипта (с FY как имя функции): 90bytes *быстрее, вероятно, во всех браузерах, кроме chrome. если у вас есть какие-либо вопросы просто спросить. редактировать используя верхние проголосованные функции. редактировать Был расчет в избытке (не нужно —c+1)и никто не заметил короче (4bytes) и быстрее(проверьте его!). кэширование в другом месте var rnd=Math.random и затем использовать rnd() также немного увеличит производительность на больших массивах. читабельная версия (используйте оригинальную версию. это медленнее, vars бесполезны, как и замыкания &»;», сам код также короче . возможно, прочтите это как «минимизировать» код Javascript , кстати, вы не можете сжимать следующий код в JavaScript, который minifiers, как выше один.) вы можете сделать это легко с помощью карты и сортировки:
вы можете перетасовать полиморфные массивы, и сортировка так же случайна, как математика.случайный, что достаточно хорошо для большинства целей. поскольку элементы сортируются по согласованным ключам, которые не являются восстанавливается каждая итерация, и каждое сравнение тянет из одного и того же распределения любую неслучайность в распределении математики.random отменяется. очень простой способ для небольших массивов это: Это, вероятно, не очень эффективно, но для небольших массивов это работает просто отлично. Вот пример, чтобы вы могли видеть, насколько он случайный (или нет), и подходит ли он для вашего использования или нет. добавление к ответу @Laurens Holsts. Это 50% сжатых. С ES2015 вы можете использовать это: Я нашел этот вариант, висящий в ответах «удален автором» на дубликат этого вопроса. В отличие от некоторых других ответов, которые уже имеют много ответов, это:
С ES6, 2020некоторые из ответов могут быть сокращены с помощью последнего ES6. перемешать массив на местеС ES6 мы можем назначить два значения сразу. Это особенно удобно в строке 4 выше, где две переменные меняются местами в одной строке кода. оставьте исходный массив нетронутым и верните перетасованный массивесли вы хотите сделать более чистую функцию и оставить исходный массив нетронутым, вы можете просто дублируйте массив, а затем выполните тот же алгоритм. восходящий алгоритмалгоритм ниже использует восходящий цикл. Она менее интуитивна, но коротка и достоверна. проверка надежности Рандомизирующей функциифункции выше представили равномерное распределение при передаче в’ testShuffledArrayFun ‘ ниже, как в Chrome, так и в Node. Это в соответствии с тем, что мы ожидаем от рандомизации функция. Фишер-Йейтс shuffle в javascript. Я размещаю это здесь, потому что использование двух функций утилиты (swap и randInt) проясняет алгоритм по сравнению с другими ответами здесь. прежде всего, посмотрите здесь для отличного визуального сравнения различных методов сортировки в javascript. во-вторых, если вы быстро посмотрите на ссылку выше, вы найдете, что random order сортировка, по-видимому, работает относительно хорошо по сравнению с другими методами, при этом очень легко и быстро реализовать, как показано ниже: редактировать: как указал @gregers, функция сравнения вызывается со значениями, А не индексы, поэтому вам нужно использовать indexOf . Обратите внимание, что это изменение делает код менее подходящим для больших массивов как indexOf работает в O (n) времени. еще одна реализация Fisher-Yates, используя строгий режим: вы можете сделать это легко с: функция shuffle, которая не изменяет исходный массивобновление: здесь я предлагаю относительно простой (не сложности перспектива) и short алгоритм, который будет отлично работать с небольшими массивами, но он определенно будет стоить намного больше, чем классический Durstenfeld когда вы имеете дело с огромными массивами. Вы можете найти Durstenfeld в одном из лучших ответы на этот вопрос. если вы не хочу ваша функция перемешивания, чтобы мутировать исходный массив, вы можете скопировать его в локальную переменную, а потом делать все остальное с простым тасу логика. тасу логика: выберите случайный индекс, затем добавьте соответствующий элемент в результате массив и удалите его из массив источник копия. Повторяйте это действие, пока исходный массив не получит пустой. и если вы действительно хотите, чтобы он был коротким, вот как далеко я мог бы получить: все остальные ответы основаны на математике.случайный (), который является быстрым, но не подходит для cryptgraphic рандомизации уровень. приведенный ниже код использует известный при использовании Web Cryptography API на криптографический уровень рандомизации. просто чтобы иметь палец в пироге. Здесь я представляю рекурсивную реализацию Fisher Yates shuffle (я думаю). Это дает равномерную случайность. (двойной оператор Тильды) на самом деле ведет себя как Math.floor() для положительных действительных чисел. Просто короткий путь. хотя уже есть ряд реализаций, но я чувствую, что мы можем сделать его короче и проще с помощью цикла forEach, поэтому нам не нужно беспокоиться о вычислении длины массива, а также мы можем безопасно избежать использования временной переменной. минимальные arrayShuffle функции С теоретической точки зрения, наиболее элегантный способ сделать это, по моему скромному мнению, должен получить один случайное число между и n!-1 и вычислить отображение один к одному из <0, 1, …, n!-1>ко всем перестановкам (0, 1, 2, …, n-1) . Пока вы можете использовать (псевдо-)генератор случайных чисел, достаточно надежный для получения такого числа без какого-либо значительного смещения, у вас достаточно информации для достижения того, что вы хотите, без необходимости нескольких другие случайные числа. при вычислении с IEEE754 двойной точностью плавающих чисел, вы можете ожидать, что ваш генератор случайных обеспечить около 15 десятичных знаков. Так как у вас есть 15!=1,307,674,368,000 (С 13 цифрами) вы можете использовать следующие функции с массивами, содержащими до 15 элементов, и предположить, что не будет значительного смещения с массивами, содержащими до 14 элементов. Если вы работаете над проблемой фиксированного размера, требующей многократного вычисления этой операции перетасовки, вы можете попробовать следующий код, который мая быть быстрее, чем другие коды, так как он использует Math.random только один раз (это однако включает в себя несколько операций копирования). следующая функция не будет использоваться, но я все равно ее дам; она возвращает индекс заданной перестановки (0, 1, 2, …, n-1) в соответствии с отображением один к одному, используемым в этом сообщении (наиболее естественным при перечислении перестановок); он предназначен для работы с до 16 элементами: в обратная функция предыдущей функции (требуется для вашего собственного вопроса) ниже; она предназначена для работы с до 16 элементами; она возвращает перестановку order n of (0, 1, 2, …, s-1) : теперь, что вы хотите, только это: он должен работать до 16 элементов с небольшим теоретическим уклоном (хотя и незаметным с практической точки зрения); его можно рассматривать как полностью пригодный для 15 элементов; с массивами, содержащими менее 14 элементов, вы можете смело считать не будет абсолютно никакой предвзятости. Нужно перемешать массив на C++. Есть массив, его нужно случайным образом перемешать. Нужен именно КОД, а не алгоритмпод «КОД» я имел ввиду несколько строчек которые я смогу использовать в моей программе, с соблюдением синтаксиса void main() for (int n = 0; n Остальные ответы using namespace std; void swap (char *a, int e1, int e2) srand( time( NULL ) ); как случайным образом зациклить массив (перемешать) в BashУчитывая массив элементов (серверов), как я могу перемешать массив, чтобы получить случайный новый массив? Существует команда shuf (man-страница), но она существует не на каждом linux. Это моя первая попытка опубликовать переполнение стека ответов на вопросы, если у вас есть лучшее решение, пожалуйста, опубликуйте его. Это еще одно чистое решение Bash: Это Shellcheck -clean и протестировано с Bash 3 и Bash 4. Вызывающая outarray получает результаты из outarray а не помещает их в outarray потому что outarray=( $(perm. ) ) не работает, если какой-либо из элементов, которые должны быть перетасованы, содержат пробельные символы, и может также сломаться, если элементы содержат glob метасимволы. Нет хорошего способа вернуть нетривиальные значения из функций Bash. Если perm вызывается из другой функции, то объявление outarray в вызывающей стороне (например, с local -a outarray ) позволит избежать создания (или сглаживания) глобальной переменной. Код можно смело упростить, выполнив обмен безоговорочно, ценой выполнения некоторых бессмысленных обменов элементами с собой. Перемешать массив случайным образом1106 просмотра 1 ответ 46 Репутация автора Я пишу программу, которая читает текстовый файл в качестве входных данных и случайным образом перемешивает массив строк для пользователя. Я написал программу, которая случайным образом перемешивает строковый массив, но я хочу сделать это так, чтобы никакие два одинаковых элемента не были рядом друг с другом. Вот пример: исходный массив будет выглядеть так Перетасованный массив будет выглядеть так Но в настоящее время моя программа создает выходной массив этого Вот мой код, который случайным образом перемешивает элементы: Ответы (1)3 плюса 165448 Репутация автора Насколько я знаю, нет лучшего решения, чем многократное использование перемешивания Фишера-Йейтса, пока вы не найдете расположение без смежных дубликатов. (Это обычно называется стратегией отказа.) Время, которое потребуется для этого, зависит от вероятности того, что случайный случайный случай имеет смежные дубликаты, который будет низким, если дубликатов мало, и может достигать 1,0, если более половины набора является одним и тем же элементом большинства. Поскольку стратегия отклонения никогда не прекращается, если не существует возможного квалификационного соглашения, может стоить потрудиться проверить, возможно ли решение, что означает отсутствие элемента большинства. Для этого, при необходимости, существует алгоритм O (n), но, учитывая предоставленные вами точные данные, он не должен быть (пока). Вы можете сразу отказаться, а не продолжать до конца перемешивания, что значительно сокращает затраты на запуск алгоритма. Так что просто используйте свой алгоритм перемешивания, но перезапустите счетчик, если вы поместите элемент рядом с одним из его близнецов. Кстати, использование strcpy для перемещения элементов действительно неэффективно. Просто перемешайте указатели. Вот код, адаптированный из этого ответа . Я предположил, что дубликаты являются точными, для простоты; возможно, у вас есть другой способ сказать (например, смотреть только на первое слово): Для вашего случая использования, когда у вас есть 10 объектов с частотами 3, 3, 2 и 2, существует 605 376 действительных расположений, из общего числа 3 628 800 (10!), Поэтому около пяти из каждых шести перемешиваний будут отклонены до того, как вы найдете действительная договоренность, в среднем. Тем не менее, досрочное прекращение означает, что вы будете выполнять в шесть раз больше работы, чем один случайный случай; эмпирические результаты показывают, что для получения действительного перемешивания 10 объектов с вышеуказанными частотами требуется около 33 перестановок. Примечание: rand()%k это не очень хороший способ генерирования равномерного распределения целых чисел от 0 до k-1. Вы найдете много советов об этом на этом сайте. shuffle — Перемешивает массив(PHP 4, PHP 5, PHP 7) shuffle — Перемешивает массив ОписаниеЭта функция перемешивает элементы массива в случайном порядке. Список параметровВозвращаемые значенияВозвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки. ПримерыПример #1 Пример использования shuffle() Примечания
Перемешать массив случайным образомДобрый день, давайте попробуем решить такую задачку: Ну и небольшое дополнение для любителей простых решений (ведь можно сказать, что если мы поменяем просто два элемента массива местами то массив перемешан ) — каждый элемент массива должен поменять своё местоположение. Ну или хотя бы сделать попытку к изменению Исправлено: Extortioner, 19.04.11 14:15
Сообщений: 3539 |
А каков критерий случайности?
Сообщений: 20 |
Пробный шар (т.к. не совсем понял условие) n=500000 pol=INT(n/2) j=SECONDS()
Сообщений: 854 |
Сообщений: 854 |
Сообщений: 854 |
Ну если хотите пример то пожалуйста Запускаем процедуру ещё раз То есть заранее невозможно предугадать каким будет выходной набор.
Сообщений: 33149 |
Да ради бога, берёшь и «сдвигаешь» массив циклически на некотрое случайное число элементов. Т.е. было
Сообщений: 854 |
Ну дак, а я и не говорил, что каждый член массива обязательно должен поменять своё местоположение — вот мои слова «каждый элемент массива должен поменять своё местоположение. Ну или хотя бы сделать попытку к изменению» — то есть теоретически может выпасть случай, когда элемент останется на своём месте, но вероятность этого должна быть крайне мала. Кстати, задача не такая уж и теоретическая, когда я в вузе учился преподаватель при помощи такого алгоритма моделировал какие-то вещи из микромира — то-ли движения молекул то-ли что.
Сообщений: 3539 |
Я так понял эту сумбурную формулировку задачи: Т.е. решение должно быть производным от
Сообщений: 854 |
Наверное я на самом деле не умею задачи ставить Приведу свой пример решения: Суть алгоритма — устанавливаю указатель на последний элемент. Выбираю какой-то элемент из всего массива, меняю их местами, при этом сдвигаю указатель на одну позицию влево. На следующей итерации происходит выбор из n-1 членов массива. Таким образом мы получаем ситуацию, когда каждый элемент массива хотя бы попытался изменить своё местоположение.
Сообщений: 33149 |
Не могу оценить насколько качественно этот алгоритм перемешивает таблицу, я бы поступил проще — в 2-мерном массиве, а лучше в курсоре, во вспомогательное поле/2 колонку поместил случайное число и потом просто отсортировал по этому полю/колонке. При том для курсора можно обойтись вообще без «поля с номером», используя RECNO() — ну для твоей задачи с «номерами от 1 до N» это подходит.
Сообщений: 854 |
Пример работы моего алгоритма: За ссылку спасибо, почитаю
Сообщений: 3276 |
Вариант: PS. Чорд. Поторопился. Не успел до Игоря дочитать. Исправлено: pasha_usue, 24.04.11 13:15
Сообщений: 33149 |
«Неравномерность» можно устранить используя RAND()*2^32, а чтобы этот диапазон (от 0 до чуть меньше чем 2^32) помещался в Integer поле дописать -2^31+1 |