Перемешать массив случайным образом


Содержание

Перемешать массив случайным образом

(PHP 3 >= 3.0.8, PHP 4, PHP 5)

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

Описание bool shuffle ( array &array )

Эта функция перемещает элементы массива в случайном порядке.

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

= range ( 1 , 20 );
srand ((float) microtime () * 1000000 );
shuffle ( $numbers );
while (list(, $number ) = each ( $numbers )) <
echo «$number » ;
>
?>

Замечание: Начиная с PHP 4.2.0, больше нет необходимости инициализировать генератор случайных чисел функциями srand() или mt_srand() , поскольку теперь это происходит автоматически.

FPublisher

Web-технологии: База знаний

JavaScript скрипты

Как перемешать массив случайным образом?

Размещена 3 сентабря, 2008 года

Если нужно перемешать эелементы массива в случайном порядке, то . это придется сделать самим, в Javascript нет функции shuffle такой как в PHP:

Последние поступления:

ТехЗадание на Землю

Размещена 14 марта 2020 года

Пpоект Genesis (из коpпоpативной пеpеписки)

Шпаргалка по работе с Vim

Размещена 05 декабря 2020 года

Vim довольно мощный редактор, но работа с ним не всегда наглядна.
Например если нужно отредактировать какой-то файл например при помощи crontab, без знания специфики работы с viv никак.

Ошибка: Error: Cannot find a val >Размещена 13 сентабря 2020 года

Если возникает ошибка на centos 5 вида
YumRepo Error: All mirror URLs are not using ftp, http[s] or file.
Eg. Invalid release/

Linux Optimization

Размещена 30 июля 2012 года

PowerCodX Blog

Portal despre sfera tehnologiilor informaționale

C# — Перемешать Массив

  • Solicitați un link
  • Facebook
  • Twitter
  • Pinterest
  • E-mail
  • Alte aplicații

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


Введение: Дело было вечером. Писал я маленькую программку, чисто для себя, чтобы попрактиковаться и получить новые навыки. Так как я программист на любительском уровне, знания в области программирования очень приветствуется. Так вот, писал я код и на какой-то момент мне мне было необходимо перемешать массив с разными числами так чтобы они были не повторялись. В Google я нашел ответ на свой вопрос.

Итак, чтобы перемешать массив достаточно писать 3-х строчный код:

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

В первой строке вам должно быть все понятно, здесь инициализируется целочисленный массив с числами от 1 до 10.

Во второй строке инициализируется генератор псевдослучайных чисел, т.е. генератор который выдает случайные числа. А почему мы передали Random’у в качестве seed время в милисекундах (DateTime.Now.Millisecond)? Как я понял именно привязка к времени дает нам случайные неповторяющиеся числа.

Вот здесь самый смак :). Именно здесь я не понимал как происходит перемешивание чисел, но в конце-концов добился результатов и понял(не уверен если правильно) как происходит перемешивание массива. Кто не знает это LINQ запрос. Объяснить что это такое я не буду, так как сделать за меня может Wikipedia.
Как работает этот код? Если длина моего массива равна 10, то компилятор генерирует 10 случайных неповторяющихся чисел, помещает в временный массив, после чего массив array сортируется по возрастанию случайных чисел помещенных в временном массиве.

Массив

(1) отжог! тогда я тоже сумничаю:

>>> import random
>>> a=range(1,5)
>>> random.shuffle(a)

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 алгоритм

  1. он использует в то время как — — —
  2. побитовое до пола (числа до 10 десятичных цифр (32 бита))
  3. удалены ненужные закрытия и другие вещи

размер скрипта (с FY как имя функции): 90bytes

*быстрее, вероятно, во всех браузерах, кроме chrome.


если у вас есть какие-либо вопросы просто спросить.

редактировать

используя верхние проголосованные функции.

редактировать Был расчет в избытке (не нужно —c+1)и никто не заметил

короче (4bytes) и быстрее(проверьте его!).

кэширование в другом месте var rnd=Math.random и затем использовать rnd() также немного увеличит производительность на больших массивах.

читабельная версия (используйте оригинальную версию. это медленнее, vars бесполезны, как и замыкания &»;», сам код также короче . возможно, прочтите это как «минимизировать» код Javascript , кстати, вы не можете сжимать следующий код в JavaScript, который minifiers, как выше один.)

вы можете сделать это легко с помощью карты и сортировки:

  1. мы помещаем каждый элемент в массив в объект и даем ему случайный ключ сортировки
  2. сортируем с помощью случайного ключа
  3. мы unmap, чтобы получить исходные объекты

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

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

очень простой способ для небольших массивов это:

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

добавление к ответу @Laurens Holsts. Это 50% сжатых.

С ES2015 вы можете использовать это:

Я нашел этот вариант, висящий в ответах «удален автором» на дубликат этого вопроса. В отличие от некоторых других ответов, которые уже имеют много ответов, это:

  1. на самом деле случайный
  2. не на месте (отсюда shuffled имя, а не shuffle )
  3. еще не присутствует здесь с несколькими вариантами

С 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()
<
srand((unsigned) time(NULL));

for (int n = 0; n Остальные ответы

using namespace std;

void swap (char *a, int e1, int e2)
<
char temp = a[ e1 ];
a[ e1 ] = a[ e2 ];
a[ e2 ] = temp;
>

srand( time( NULL ) );
cout Похожие вопросы

как случайным образом зациклить массив (перемешать) в 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()

Примечания

Замечание: Эта функция присваивает новые ключи элементам массива . Она удалит все существующие ключи, а не просто переупорядочит их.

Перемешать массив случайным образом

Добрый день, давайте попробуем решить такую задачку:
Дан массив чисел, от 1 до n пусть n будет достаточно большим.
Необходимо перемешать этот массив случайным образом.
Мне удалось на своём не самом быстром компьютере добиться значения 1,656 сек для
n = 500 000
Естественно вывод не учитываем — проверяем правильность работы процедуры на малых n.

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

Исправлено: Extortioner, 19.04.11 14:15

Re: Перемешать массив чисел
Goodwin

Сообщений: 3539
Откуда: Омск

Дата: 19.04.11 14:46:25

А каков критерий случайности?
Если я массив в обратном порядке или сначала чёт/потом нечёт выведу проканает?

Re: Перемешать массив чисел
katana

Сообщений: 20

Дата: 19.04.11 18:02:58


Пробный шар (т.к. не совсем понял условие)

n=500000
DECLARE mas[n]
FOR i=1 TO n
mas[i]=INT(RAND()*500000)
ENDFOR

pol=INT(n/2)
?mas[1],mas[pol+1],mas[2],mas[pol+2] &&..etc

j=SECONDS()
FOR i=1 TO pol
mas[i]=BITXOR(mas[i],mas[i+pol])
mas[i+pol]=BITXOR(mas[i+pol],mas[i])
mas[i]=BITXOR(mas[i],mas[i+pol])
ENDFOR
?SECONDS()-j

Re: Перемешать массив чисел
Extortioner
Автор

Сообщений: 854
Откуда: Новосибирск

Дата: 19.04.11 18:42:18
Re: Перемешать массив чисел
Extortioner
Автор

Сообщений: 854
Откуда: Новосибирск

Дата: 19.04.11 18:48:22
Re: Перемешать массив чисел
Extortioner
Автор

Сообщений: 854
Откуда: Новосибирск

Дата: 19.04.11 18:52:47

Ну если хотите пример то пожалуйста
1 ый случай
массив: 1 2 3 4 5 6
перемешанный массив 6 2 3 4 1 5

Запускаем процедуру ещё раз
массив: 1 2 3 4 5 6
перемешанный массив 1 3 2 4 6 5

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

Re: Перемешать массив чисел
Igor Korolyov

Сообщений: 33149

Дата: 19.04.11 23:48:38

Да ради бога, берёшь и «сдвигаешь» массив циклически на некотрое случайное число элементов. Т.е. было
1 2 3 4 5 6, а стало например 3 4 5 6 1 2 и другой раз 5 6 1 2 3 4 — формально все услвоия соблюдены, хотя от «случайности» тут практически ничего и нету.
Кстати, в истинно «случайной» перестановке НЕЛЬЗЯ запрещать некоторому элементу не покидать своего места Иначе это уже не «случайная» перестановка а вполне себе жёстко детерменированная. Т.е. по сути ДАЖЕ вариант где всего 2 элемента поменяют свои места является «случайной» перестановкой (хотя и крайне маловероятной).
Другой интересный вопрос — с чего ты взял что возвращаемое RAND значение (наверняка оно лежит в основе «случайной мешалки») является «случайной» величиной? Это абсолютно точно детерменированное значение, и, например, после 0.5713463067 всегда будет следовать 0.6693051432 и НИКОГДА не «выпадет» какое-то другое значение
Так что возможно проще всего не «мешать», а тупо генерить каждый раз новый набор, начинающийся с большой долей вероятности с «другой точки» в фоксовой последовательности (её размер, т.е. «период повторения достаточно» большой — порядка 2^32 чисел, но для такой значительной выборки как полмиллиона это уже будет заметно — в самой последовательности получится взять не более чем 9000 разных вариантов перетасовки — остальное будет по сути «склейками» из 2-х «соседних» перестановок)

Re: Перемешать массив чисел
Extortioner
Автор

Сообщений: 854
Откуда: Новосибирск

Дата: 20.04.11 05:35:37

Ну дак, а я и не говорил, что каждый член массива обязательно должен поменять своё местоположение — вот мои слова «каждый элемент массива должен поменять своё местоположение. Ну или хотя бы сделать попытку к изменению» — то есть теоретически может выпасть случай, когда элемент останется на своём месте, но вероятность этого должна быть крайне мала.
По поводу Rand — не знал, что это псевдогенератор, но тем не менее даже с ним выходные наборы не повторяются.

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

Re: Перемешать массив чисел
Goodwin

Сообщений: 3539
Откуда: Омск

Дата: 20.04.11 09:07:36

Я так понял эту сумбурную формулировку задачи:
1) должна быть перезапись всех элементов массива
2) функция rand() должна использоваться не менее 500000 раз

Т.е. решение должно быть производным от

Re: Перемешать массив чисел
Extortioner
Автор

Сообщений: 854
Откуда: Новосибирск

Дата: 20.04.11 09:58:25

Наверное я на самом деле не умею задачи ставить

Приведу свой пример решения:

Суть алгоритма — устанавливаю указатель на последний элемент. Выбираю какой-то элемент из всего массива, меняю их местами, при этом сдвигаю указатель на одну позицию влево. На следующей итерации происходит выбор из n-1 членов массива. Таким образом мы получаем ситуацию, когда каждый элемент массива хотя бы попытался изменить своё местоположение.

Re: Перемешать массив чисел
Igor Korolyov

Сообщений: 33149

Дата: 21.04.11 01:53:05

Не могу оценить насколько качественно этот алгоритм перемешивает таблицу, я бы поступил проще — в 2-мерном массиве, а лучше в курсоре, во вспомогательное поле/2 колонку поместил случайное число и потом просто отсортировал по этому полю/колонке. При том для курсора можно обойтись вообще без «поля с номером», используя RECNO() — ну для твоей задачи с «номерами от 1 до N» это подходит.
Мне кажется это даёт лучшее «перемешивание», хотя, конечно, и один и другой способ может иметь недостатки, связанные с аномалиями распределения этих самых псевдо-случайных чисел. Просто у тебя для «последних» элементов гарантируется минимальное перемешивание (для самого последнего — по сути лишь 1 «смена»), тогда как для первых таких перетасовок очень много получается (чем короче становится «оставшаяся» часть массива, тем чаще для перестановки выбираются первые элементы) и я не уверен что это хорошо.
В этой теме были ссылки на «теоретические основы» (в начале).

Re: Перемешать массив чисел
Extortioner
Автор

Сообщений: 854
Откуда: Новосибирск

Дата: 21.04.11 08:30:20

Пример работы моего алгоритма:
1 2 3 4 5
в пределах [1 .. 5] выпадает 1, мы меняем 1 и 5
5 2 3 4 1
в пределах [1 .. 4] выпадает 2, мы меняем 2 и 4
5 4 3 2 1
в пределах [1 .. 3] выпадает 1, мы меняем 1 и 3
3 4 5 2 1
в пределах [1 .. 2] выпадает 2, мы меняем 2 и 2
3 4 5 2 1 — Ничего не происходит
в пределах [1 .. 1] выпадает 1, мы меняем 1 и 1
3 4 5 2 1 — Ничего не происходит

За ссылку спасибо, почитаю

Re: Перемешать массив чисел
pasha_usue

Сообщений: 3276
Откуда: Е-бург

Дата: 24.04.11 13:06:41

Вариант:
Данный способ дает небольшую неравномерность распределения. Дело в том, что числа, получившие одинаковый индекс фокс отсортирует по порядку записей в таблице (то-есть в порядке возрастания). Неравномерность можно устранить, если вместо целых чисел использовать DOUBLE. Но индекс тогда работает медленнее.

PS. Чорд. Поторопился. Не успел до Игоря дочитать.

Исправлено: pasha_usue, 24.04.11 13:15

Re: Перемешать массив чисел
Igor Korolyov

Сообщений: 33149

Дата: 24.04.11 14:51:02

«Неравномерность» можно устранить используя RAND()*2^32, а чтобы этот диапазон (от 0 до чуть меньше чем 2^32) помещался в Integer поле дописать -2^31+1

Илон Маск рекомендует:  Слежение за файлами
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL