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

Знаменитый алгоритм перемешивания Фишера-Йейтса можно использовать для случайной перестановки массива A длины N:

For k = 1 to N
    Pick a random integer j from k to N
    Swap A[k] and A[j]

Распространенная ошибка, которую мне снова и снова говорят не совершать, заключается в следующем:

For k = 1 to N
    Pick a random integer j from 1 to N
    Swap A[k] and A[j]

То есть вместо выбора случайного целого числа от k до N вы выбираете случайное целое число от 1 до N.

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


person templatetypedef    schedule 27.02.2011    source источник
comment
Вы действительно хотите индексы на основе 1?   -  person Svante    schedule 27.02.2011
comment
Звучит знакомо. Обсуждалось ли это на SO в течение последних двух месяцев или на программистах.SE?   -  person oosterwal    schedule 16.03.2011
comment
@ oosterwal - Я задал этот вопрос около трех недель назад и не получил хорошего ответа, поэтому назначил за него большое вознаграждение, чтобы повысить интерес к нему. Надеюсь, кто-нибудь сможет просветить всех нас!   -  person templatetypedef    schedule 16.03.2011
comment
У меня нет ответа (пока), но я заметил одну вещь: каждую карту, скорее всего, можно будет найти в позиции сразу после того, где она началась. Кроме того, и первая карта, и последняя позиция распределяются равномерно - то есть первая карта имеет равную вероятность оказаться в любой позиции, и каждая карта имеет равную вероятность оказаться на последней позиции. Любое правильное решение должно обладать этими характеристиками.   -  person BlueRaja - Danny Pflughoeft    schedule 17.03.2011
comment
@Svante: почему бы и нет? Многие языки, начиная с Pascal, который часто использовался для описания алгоритмов, и включая Lua, имеют индексы, начинающиеся с 1. IIRC, Pascal позволяет начинать индексы массива с любого числа, но по умолчанию это 1.   -  person PhiLho    schedule 21.07.2011


Ответы (10)


Эмпирический подход.

Реализуем ошибочный алгоритм в системе Mathematica:

p = 10; (* Range *)
s = {}
For[l = 1, l <= 30000, l++, (*Iterations*)
   a = Range[p];
   For[k = 1, k <= p, k++, 
     i = RandomInteger[{1, p}];
     temp = a[[k]];
     a[[k]] = a[[i]];
     a[[i]] = temp
   ];
   AppendTo[s, a];
]  

Теперь узнайте, сколько раз каждое целое число находится в каждой позиции:

r = SortBy[#, #[[1]] &] & /@ Tally /@ Transpose[s]  

Давайте возьмем три позиции в результирующих массивах и построим частотное распределение для каждого целого числа в этой позиции:

Для позиции 1 распределение частот:

введите описание изображения здесь

Для позиции 5 (средняя)

введите описание изображения здесь

И для позиции 10 (последняя):

введите описание изображения здесь

и здесь у вас есть распределение для всех позиций, построенных вместе:

введите описание изображения здесь

Вот вам лучшая статистика по 8 позициям:

введите описание изображения здесь

Некоторые наблюдения:

  • Для всех позиций вероятность «1» одинакова (1 / n).
  • Матрица вероятностей симметрична относительно большой антидиагонали.
  • Таким образом, вероятность для любого числа в последней позиции также одинакова (1 / n)

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

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

введите описание изображения здесь

Для матрицы 100x100:

введите описание изображения здесь

Изменить

Ради интереса я вычислил точную формулу для второго диагонального элемента (первый - 1 / n). Остальное можно сделать, но это большая работа.

h[n_] := (n-1)/n^2 + (n-1)^(n-2) n^(-n)

Значения подтверждены от n = 3 до 6 ({8/27, 57/256, 564/3125, 7105/46656})

Изменить

Немного проработав общий явный расчет в ответе @wnoise, мы можем получить немного больше информации.

Заменив 1 / n на p [n], чтобы вычисления оставались невычисленными, мы получаем, например, для первой части матрицы с n = 7 (щелкните, чтобы увидеть увеличенное изображение):

введите описание изображения здесь

Что, после сравнения с результатами для других значений n, позволяет нам идентифицировать некоторые известные целочисленные последовательности в матрице:

{{  1/n,    1/n      , ...},
 {... .., A007318, ....},
 {... .., ... ..., ..},
 ... ....,
 {A129687, ... ... ... ... ... ... ..},
 {A131084, A028326 ... ... ... ... ..},
 {A028326, A131084 , A129687 ... ....}}

Вы можете найти эти последовательности (в некоторых случаях с разными знаками) в замечательном http://oeis.org/

Решить общую проблему сложнее, но я надеюсь, что это начало.

person Dr. belisarius    schedule 27.02.2011

Вы упомянули "распространенную ошибку" - это случайная перестановка. Эта проблема была подробно изучена Диаконисом и Шахшахани в статье Генерация случайной перестановки со случайными транспозициями (1981). Они проводят полный анализ времени остановки и сходимость к единообразию. Если вы не можете получить ссылку на газету, пришлите мне электронное письмо, и я могу переслать вам копию. На самом деле это забавное чтение (как и большинство статей Перси Диаконис).

Если в массиве есть повторяющиеся записи, проблема немного в другом. Я, Диаконис и Саундарараджан решают эту более общую проблему в качестве бессовестной затеи в Приложении B к документу Практическое правило перемешивания тасовок (2011).

person PengOne    schedule 16.03.2011
comment
Перси Диаконис потрясающий ... хотя, когда он читает лекции, он никогда не смотрит на людей, с которыми разговаривает. :-) - person templatetypedef; 16.03.2011
comment
Действительно ли статья 1981 года рассматривает эту конкретную ситуацию? Я думал, что проблема, поскольку состояние рассматривает распределение перестановок формы (1 a_1) (2 a_2) ... (n a_n), где каждый a_i выбирается равномерно из 1..n. - person mhum; 16.03.2011
comment
Не могли бы вы подвести итог для тех из нас, кто не может получить доступ к бумаге? - person BlueRaja - Danny Pflughoeft; 17.03.2011
comment
@mhum: Я считаю, что вы правы, что это не совсем так. Хотя у меня нет непосредственного доступа к статье 1981 года, соответствующие результаты в Групповых представлениях в вероятности и статистике охватывают равномерно случайные транспозиции, а не те, в которых транспозиции включают фиксированные элементы. (Они прекрасно обобщаются до равномерно случайных по любому классу сопряженности, но я не вижу, как заставить их применять здесь напрямую.) - person wnoise; 18.03.2011
comment
Очень жаль, что за это автоматически назначали награду, так как на самом деле это не отвечает на вопрос ... - person BlueRaja - Danny Pflughoeft; 24.03.2011
comment
Я не знаю, как это произошло, учитывая, что Велисарий получил (заслуженно) более высокий рейтинг. - person PengOne; 24.03.2011
comment
@Peng Потому что я опубликовал свой ответ до начала награждения - person Dr. belisarius; 08.05.2011

Скажем

  • a = 1/N
  • b = 1-a
  • B i (k) - матрица вероятности после i перестановок на k-й элемент. т.е. ответ на вопрос «где k после i свопов?». Например, B 0 (3) = (0 0 1 0 ... 0) и B 1 (3) = (a 0 b 0 ... 0). Вам нужно B N (k) для каждого k.
  • K i - это матрица NxN с единицами в i-м столбце и i-й строке, нули везде, например:

kappa_2

  • I i - это единичная матрица, но с обнуленным элементом x = y = i. Например, для i = 2:

I_2

  • i - это

Ai = bIi + aKi

Потом,

B_n

Но поскольку B N (k = 1..N) формирует единичную матрицу, вероятность того, что любой заданный элемент i окажется в конце в позиции j, определяется элементом матрицы (i, j) матрицы:

матрица решений

Например, для N = 4:

B_4

В виде диаграммы для N = 500 (уровни цвета равны 100 * вероятности):

B_500

Шаблон одинаков для всех N> 2:

  • Наиболее вероятная конечная позиция для k-го элемента - k-1.
  • наименее вероятная конечная позиция - k для k ‹N * ln (2), позиция 1 в противном случае.
person Eelvex    schedule 22.03.2011
comment
Вычислить аналитические результаты легко даже для больших N, но выражения слишком запутаны, чтобы включать их здесь. - person Eelvex; 22.03.2011
comment
Кажется, это правильно, но ... как вы к этому пришли? Это то же самое, что и ответ wnoise? (извините, боюсь, я не понимаю стохастические матрицы ..) - person BlueRaja - Danny Pflughoeft; 22.03.2011
comment
@EElvex Я бы хотел знать, как вы это рассчитали. - person Mike Bailey; 29.07.2011

Я знал, что видел этот вопрос раньше ...

"почему это простой алгоритм перемешивания дает необъективные результаты? в чем простая причина? "есть много хороших ответов в ответах, особенно ссылка на блог Джеффа Этвуда о Coding Horror.

Как вы, возможно, уже догадались, основываясь на ответе @belisarius, точное распределение сильно зависит от количества элементов, которые нужно перетасовать. Вот сюжет Этвуда для колоды из 6 элементов:

введите описание изображения здесь

person oosterwal    schedule 15.03.2011
comment
Спасибо за ссылку / картинку, но все, что это подтверждает, это то, что вы получаете что-то неоднородное. Однако я больше надеялся на аналитическое решение того, что такое фактическое распределение. - person templatetypedef; 16.03.2011
comment
Проголосовали за то, что поделился ссылкой Джеффа Этвуда, в которой также описан способ получения распределения - неработающая случайная последовательность имеет n ^ n равновероятных вариантов случайных чисел, сопоставленных с n! выходы. Я не думаю, что вы получите аналитическое решение; просто числовой для малых значений n. - person Chris Nash; 18.03.2011

Какой прекрасный вопрос! Хотел бы я получить полный ответ.

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

Мы можем анализировать это так же, как цепь Маркова, описывая действия как матрицы стохастических переходов, линейно воздействующие на распределения вероятностей. Большинство элементов остается в покое, диагональ обычно (n-1) / n. На проходе k, когда они не остаются одни, они меняются местами на элемент k (или случайный элемент, если они являются элементом k). Это 1 / (n-1) в строке или столбце k. Элемент как в строке, так и в столбце k также равен 1 / (n-1). Достаточно легко перемножить эти матрицы для перехода k от 1 до n.

Мы знаем, что элемент на последнем месте с одинаковой вероятностью изначально был где угодно, потому что последний проход меняет местами последнее место с равной вероятностью с любым другим. Точно так же первый элемент с одинаковой вероятностью будет размещен где угодно. Эта симметрия возникает из-за того, что транспонирование меняет порядок умножения матриц на противоположный. Фактически, матрица симметрична в том смысле, что строка i совпадает с столбцом (n + 1 - i). Помимо этого, цифры не показывают явной закономерности. Эти точные решения действительно показывают согласие с моделированием, проведенным Велизарием: в слоте i вероятность получения j уменьшается по мере увеличения j до i, достигая минимального значения в i-1, а затем перепрыгивая до самого высокого значения в i, и убывает, пока j не достигнет n.

В Mathematica я генерировал каждый шаг с

 step[k_, n_] := Normal[SparseArray[{{k, i_} -> 1/n, 
                      {j_, k} -> 1/n, {i_, i_} -> (n - 1)/n} , {n, n}]]

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

Fold[Dot, IdentityMatrix[n], Table[step[m, n], {m, s}]]

ListDensityPlot - полезный инструмент визуализации.

Редактировать (Велизарий)

Просто подтверждение. Следующий код дает ту же матрицу, что и в ответе @Eelvex:

step[k_, n_] := Normal[SparseArray[{{k, i_} -> (1/n), 
                      {j_, k} -> (1/n), {i_, i_} -> ((n - 1)/n)}, {n, n}]];
r[n_, s_] := Fold[Dot, IdentityMatrix[n], Table[step[m, n], {m, s}]];
Last@Table[r[4, i], {i, 1, 4}] // MatrixForm
person wnoise    schedule 27.02.2011
comment
Звучит интересно, но я не понял, каковы ваши распределения вероятностей on - мне кажется, что каждое состояние в цепи Маркова, которую вы описываете, должно указывать порядок всех n элементов (т. Е. задача с n элементами требует (n!) -состояний цепи Маркова). Это то, что вы имели ввиду? Также не уверен в ваших рассуждениях о том, что последний элемент с одинаковой вероятностью прибыл откуда угодно - это верно, если все n элементов равномерно случайным образом распределены после обработки 1-го n-1 элементов, и я не верю, что случай (или, по крайней мере, я хотел бы увидеть доказательство). - person j_random_hacker; 28.02.2011
comment
Состояния - это n слотов. Запись i, j в матрице перехода - это шанс перехода от слота i к слоту j. Превращение матрицы перехода в распределение на том месте, где оказался элемент i, - это просто выбор строки i. Распределение того, откуда пришел элемент j, просто выбирает столбец j. Это действительно не учитывает перестановки, только то, где заканчиваются элементы. - person wnoise; 28.02.2011
comment
@j_random_hacker: последняя операция меняет местами последний элемент с любым элементом с равной вероятностью. Независимо от распределения до этого, последний элемент выбирается случайным образом из всех. - person wnoise; 28.02.2011
comment
Спасибо, после того, как я немного по алгебре, я понял ваш последний пункт. Что касается марковских состояний: значит, вы имеете в виду, что отслеживаете движение (= вероятности нахождения в каждом слоте) определенного элемента? (Например, предположим, что изначально i-м элементом был i. Тогда мы могли бы сказать, что транспонированный вектор-столбец ([0, 0, 1, 0, ..., 0]) представляет собой начальное распределение вероятностей местоположения элемента 3, и что предварительное умножение этого на матрицу перехода, соответствующую 1-му обмену, дало бы распределение вероятностей местоположения элемента 3 после этого шага ... - person j_random_hacker; 28.02.2011
comment
@j_random_hacker: совершенно верно. Матрица перехода отслеживает все эти вероятности одновременно для всех элементов, но не отслеживает корреляции (что может быть сделано путем прямого отслеживания перестановок). - person wnoise; 28.02.2011
comment
А, хорошо. Я наполовину написал еще один комментарий, но думаю, что сейчас нахожусь на правильной странице. По сути, перемешивание является равномерно случайным тогда и только тогда, когда для любого элемента i результат умножения n матриц перехода, за которым следует вектор-столбец с 1 в строке i и 0 в другом месте, равен [1 / n, 1 / n, ..., 1 / п]. Это эквивалентно требованию, чтобы каждый столбец в продукте матриц перехода равнялся этому, что эквивалентно требованию, чтобы каждая отдельная запись в матрице продукта была 1 / n. - person j_random_hacker; 28.02.2011

На странице Википедии о перемешивании Фишера-Йейтса есть описание и пример того, что именно будет случиться в таком случае.

person Jeremiah Willcock    schedule 27.02.2011
comment
Спасибо за ссылку, но отчасти я задал этот вопрос потому, что в статье в Википедии просто говорится, что вы не получите равномерного распределения, а не то, как это неравномерное распределение выглядит математически. То есть не обсуждается вероятность того, что конкретный элемент окажется в определенном месте. - person templatetypedef; 27.02.2011
comment
@templatetypedef: для простого случая есть цифра (я считаю, что 6 или 7 элементов). Я знаю, что это не совсем общий ответ. - person Jeremiah Willcock; 27.02.2011

Распределение можно вычислить с помощью стохастических матриц. Пусть матрица A (i, j) описывает вероятность того, что карта, первоначально находившаяся в позиции i, окажется в позиции j. Тогда k-й обмен имеет матрицу Ak, заданную Ak(i,j) = 1/N, если i == k или j == k, (карта в позиции k может оказаться где угодно, и любая карта может оказаться в позиции k с равной вероятностью), Ak(i,i) = (N - 1)/N для всех i != k (все остальные карты останутся там же с вероятностью (N-1) / N) и все остальные элементы нулевые.

Результат полного перемешивания определяется произведением матриц AN ... A1.

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

ОБНОВЛЕНИЕ: я только что заметил эквивалентный ответ wnoise выше! ой ...

person daoudc    schedule 18.03.2011

Я изучил это подробнее, и оказалось, что это распределение было изучено достаточно подробно. Причина, по которой это интересно, состоит в том, что этот «сломанный» алгоритм используется (или использовался) в системе микросхем RSA.

В перемешивании с помощью полуслучайной перестановки это изучают Эльханан Моссель, Юваль Перес и Алистер Синклер. и более общий класс перемешивания. Результатом этой статьи, по-видимому, является log(n) прерывистое перемешивание для достижения почти случайного распределения.

В разделе Смещение трех псевдослучайных перемешиваний (Aequationes Mathematicae, 22, 1981, 268-292) Итан Болкер и Дэвид Роббинс анализируют это перемешивание и определяют, что общее расстояние вариации до однородность после одного прохода равна 1, что указывает на то, что это совсем не случайный результат. Они также проводят асимпотический анализ.

Наконец, Лоран Салофф-Кост и Джессика Зунига нашли хорошую оценку сверху в своем исследовании неоднородных цепей Маркова.

person PengOne    schedule 23.09.2011

Этот вопрос требует проведения интерактивной визуальной матричной диаграммы упомянутого неработающего перемешивания . Такой инструмент находится на странице Будет ли он перемешиваться? - Почему случайные компараторы плохи Майка Бостока.

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

Его страница информативна, поскольку позволяет увидеть немедленный эффект изменения логики на перетасованные данные. Например:

Эта матричная диаграмма с использованием неравномерного и очень предвзятого перемешивания создается с использованием наивной замены (мы выбираем от «1 до N») с таким кодом:

function shuffle(array) {
    var n = array.length, i = -1, j;
    while (++i < n) {
        j = Math.floor(Math.random() * n);
        t = array[j];
        array[j] = array[i];
        array[i] = t;
    }
}

предвзятое перемешивание

Но если мы реализуем беспристрастное перемешивание, где мы выбираем от «k до N», мы должны увидеть такую ​​диаграмму:

введите описание изображения здесь

где распределение является равномерным и создается из такого кода, как:

function FisherYatesDurstenfeldKnuthshuffle( array ) {
    var pickIndex, arrayPosition = array.length;
    while( --arrayPosition ) {
        pickIndex = Math.floor( Math.random() * ( arrayPosition + 1 ) );
        array[ pickIndex ] = [ array[ arrayPosition ], array[ arrayPosition ] = array[ pickIndex ] ][ 0 ];
    }
}
person Mac    schedule 21.10.2015
comment
Это был бы гораздо лучший ответ, если бы вы включили сюда больше информации, а не скрывали бы ее за ссылкой. - person Teepeemm; 21.10.2015
comment
Я не согласен. Я не видел необходимости пытаться повторить отличные ответы, которые уже были даны daoudc, wnoise, Eelvex, и особенно belisarius is forward < / b>. Все, чего не хватало в ответах на этой странице, - это некая интерактивная модель. Ссылка предоставляет это. - person Mac; 22.10.2015

Отличные ответы, данные до сих пор, касаются распространения, но вы также спросили «Что произойдет, если вы сделаете эту ошибку?» - на этот вопрос я еще не видел ответа, поэтому я дайте объяснение по этому поводу:

Алгоритм тасования Кнута-Фишера-Йейтса выбирает 1 из n элементов, затем 1 из n-1 оставшихся элементов и так далее.

Вы можете реализовать это с двумя массивами a1 и a2, где вы удаляете один элемент из a1 и вставляете его в a2, но алгоритм делает это на месте (что означает, что ему нужен только один массив), как объясняется здесь (Google:" Алгоритмы перетасовки Fisher-Yates DataGenetics ") очень хорошо.

Если вы не удалите элементы, они могут быть снова выбраны случайным образом, что приведет к смещенной случайности. Это именно то, что делает второй пример, который вы описываете. Первый пример, алгоритм Кнута-Фишера-Йейтса, использует переменную курсора от k до N, которая запоминает, какие элементы уже были взяты, что позволяет избегать выбора элементов более одного раза.

person Matt    schedule 09.03.2015
comment
Как вы думаете, можно было бы заменить здесь что-нибудь более доступное для Google? - person Wolf; 09.03.2015
comment
Готово, я добавил подсказку для поиска в Google, но ссылка уже была здесь. - person Matt; 09.03.2015
comment
В этом проблема со ссылками здесь: намерение может быть очевидным для автора, но не для читателя (до того, как он последует за ним). Это все равно, что указывать на ландшафт и говорить: посмотрите туда! Более проблематично то, что иногда веб-страницы исчезают или целые сайты закрываются (надеюсь, архивируются раньше): это время, когда здесь простой становится бессмысленным. Тем не менее, спасибо, что приняли во внимание мое предложение. - person Wolf; 09.03.2015
comment
@Wolf: Хороший момент, я не думал об этом раньше. Вы правы, если контент перемещается, поиск в Google все равно может быть полезен. Спасибо, что обратили на это мое внимание! - person Matt; 09.03.2015