Уменьшает ли смещение смещения при повторении случайного перемешивания со смещением?

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

Известно, что тасование Фишера-Ятса является беспристрастным, если основной генератор случайных чисел (ГСЧ) беспристрастен.

To shuffle an array a of n elements:
  for i from n − 1 downto 1 do
       j ← random integer with 0 ≤ j ≤ i
       exchange a[j] and a[i]

Но что, если ГСЧ смещен (но быстро)?

Предположим, я хочу произвести множество случайных перестановок массива из 25 элементов. Если я использую алгоритм Фишера-Йейтса со смещенным ГСЧ, то моя перестановка будет смещена, но я считаю, что это предполагает, что массив из 25 элементов начинается с того же состояния перед каждым применением алгоритма перемешивания. Одна проблема, например, заключается в том, что если ГСЧ имеет только период 2 ^ 32 ~ 10 ^ 9, мы не можем произвести все возможные перестановки из 25 элементов, потому что это 25! ~ 10 ^ 25 перестановок.

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

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

Кто-нибудь знает какое-либо исследование, посвященное этому вопросу?

В качестве подвопроса: что, если мне нужны только повторяющиеся перестановки 5 из 25 элементов в массиве, поэтому я использую алгоритм Фишера-Йейтса для выбора 5 элементов и остановки перед выполнением полного перемешивания? (Я использую 5 элементов на конце массива, который поменяли местами.) Затем я начинаю заново, используя предыдущий частично перемешанный массив из 25 элементов, чтобы выбрать другую перестановку 5. Опять же, похоже, что это было бы лучше, чем начинать с исходный массив из 25 элементов, если базовый ГСЧ имел смещение. Есть мысли по этому поводу?

Я думаю, что было бы легче протестировать случай частичного перемешивания, поскольку существует только 6 375 600 возможных перестановок 5 из 25 элементов, поэтому есть ли какие-нибудь простые тесты для проверки смещений?


person JohnPS    schedule 29.09.2010    source источник
comment
Вы когда-нибудь тестировали это, чтобы получить ответ?   -  person AShelly    schedule 12.03.2011
comment
Я не проводил никаких формальных тестов на предвзятость. Я полагаю, что при смещенном ГСЧ будет смещение от одного перемешивания к другому, но, возможно, оно будет незаметным при просмотре итогов каждой перестановки, выбранной из миллионов перестановок. В итоге я использовал генератор Фибоначчи с задержкой (LFG) и оставил колоду в перемешанном состоянии, чтобы начать следующую перестановку. Я считаю, что это беспристрастно, и для меня это достаточно быстро. Поэтому я выбрал быстрый ГСЧ и максимально оптимизировал все.   -  person JohnPS    schedule 12.03.2011
comment
К тому времени, как вы перетасовываете его достаточно, чтобы устранить предвзятость, вам будет лучше всего один раз использовать беспристрастный.   -  person Cyoce    schedule 17.12.2015


Ответы (5)


если ГСЧ имеет только период 2 ^ 32 ~ 10 ^ 9, мы не сможем произвести все возможные перестановки из 25 элементов, потому что это 25! ~ 10 ^ 25 перестановок

Это верно только до тех пор, пока семя определяет каждый последующий выбор. Пока можно ожидать, что ваш ГСЧ будет обеспечивать точно равномерное распределение в диапазоне, указанном для каждого следующего выбора, он может производить каждую перестановку. Если ваш ГСЧ не может этого сделать, более крупная исходная база не поможет.

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

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

person Nick Larsen    schedule 29.09.2010
comment
Нет, он прав - если ваш ГСЧ имеет период 10 ^ 9, он не может сгенерировать 25! различные последовательности, и, следовательно, все тасования не равновероятны. Я бы не ожидал увидеть какое-либо систематическое искажение, при котором возможны перетасовки, если ГПСЧ хотя бы отдаленно хорош. - person Nick Johnson; 30.09.2010
comment
Я никогда не говорил, что он был неправ. Я указал, что то, что он сказал, справедливо только при использовании ГСЧ с периодом, меньшим, чем общее количество перестановок, и начальное число определяет каждое последующее сгенерированное число. Существует ряд альтернативных методов ГСЧ, в которых не используются начальные числа или периоды. Когда вы удаляете зависимость семени, мои утверждения верны. - person Nick Larsen; 30.09.2010
comment
Хорошая точка зрения. Я рассматривал только ГСЧ, которые создают одну последовательность с определенным периодом (скажем, 2 ^ 32), а начальное число определяет только начальную точку в этой последовательности, например, простые линейные конгруэнтные генераторы. - person JohnPS; 01.10.2010

Пара моментов:

1) Любой, кто использует перемешивание Фишера Йейтса, должен прочитать это и дважды убедитесь, что их реализация верна.
2) Разве повторение перемешивания не противоречит цели использования более быстрого генератора случайных чисел? Конечно, если вам придется повторять каждую перетасовку 5 раз, чтобы получить желаемую энтропию, вам лучше использовать генератор с низким смещением.
3) У вас есть установка, где вы можете это проверить? Если это так, начните пробовать что-то - графики Джеффа ясно показывают, что вы можете легко обнаружить довольно много ошибок, используя небольшие колоды и визуально отображая результаты.

person Daniel    schedule 29.09.2010
comment
Перемешивание, указанное в исходном вопросе, принадлежит Фишеру-Йейтсу и реализовано правильно. - person Nick Larsen; 30.09.2010
comment
Я нашел 1.) интересным, потому что я думал, что большинство программистов уже знают, как правильно перемешивать. Тем не менее, я смотрел на набор тестов сортировки для open jdk и увидел, что они просто повторяли наивную перетасовку много раз снова при перетасовке тестовых данных. Я подумал, есть ли у них для этого какие-то причины, но я думаю, что нет. - person Justin Peel; 30.09.2010
comment
Что касается пункта 2, я хочу использовать каждое случайное перемешивание, а затем просто повторно использовать его для следующего перемешивания. Не перемешивайте 2 или более раз перед использованием перестановки. - person JohnPS; 30.09.2010
comment
Что касается графиков Джеффа, использование меньших наборов на самом деле легко показывает различия, но для перетасовки, скажем, колоды карт N = 52, количество раз, которое вам придется перетасовать, чтобы показать статистически значимые различия, довольно поразительно. Таким образом, гораздо проще использовать доказательства. - person Nick Larsen; 30.09.2010
comment
Я согласен с тем, что простой тест будет заключаться в том, чтобы увидеть, что каждая перестановка (скажем, 5 из 25) производится примерно одинаково для большого размера выборки. Как отмечает НикЛарсен, с колодой карт сделать это труднее, если мы хотим получить полные перестановки из 52 карт. - person JohnPS; 30.09.2010
comment
@NickLarsen: Зависит от того, насколько предвзят ваш ГСЧ. Если он чередуется между нечетными и четными выходами, вы можете с огромной уверенностью обнаружить смещение при одиночном перетасовке колоды из 52 карт. - person Steve Jessop; 30.09.2010

Мне кажется, что при предвзятом ГСЧ повторные прогоны тасования Кнута произведут все перестановки, но я не могу это доказать (это зависит от периода ГСЧ и насколько это предвзято).

Итак, давайте обратим вопрос: учитывая алгоритм, который требует случайного ввода и смещенного ГСЧ, легче ли устранить перекос на выходе алгоритма или на выходе из генератора случайных чисел?

Неудивительно, что последнее сделать намного проще (и представляет больший интерес): для этого существует несколько стандартных техник. Простая техника, разработанная фон Нейманом, заключается в следующем: получить поток битов от смещенного ГСЧ, взять биты парами, отбросить каждую пару (0,0) и (1,1), вернуть 1 для каждого (1,0) пара и 0 для каждой пары (0,1). Этот метод предполагает, что биты из потока, где каждый бит имеет ту же вероятность быть 0 или 1, что и любой другой бит в потоке, и что биты не коррелированы. Элиас обобщил технику фон Неймана в более эффективную схему (тот, в котором отбрасывается меньшее количество битов).

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

Другой вариант - передать смещенный вывод ГСЧ криптографически стойкой функции, например алгоритму дайджеста сообщения, и использовать его вывод.

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

Я хочу сказать, что качество, если результат случайного алгоритма ограничен сверху энтропией, обеспечиваемой ГСЧ: если он чрезвычайно смещен, результат будет чрезвычайно смещенным, независимо от того, что вы делаете. Алгоритм не может выжать больше энтропии, чем та, которая содержится в смещенном случайном потоке битов. Хуже того: вероятно, он потеряет какие-то случайные биты. Даже если предположить, что алгоритм работает со смещенным ГСЧ, для получения хорошего результата вам придется приложить вычислительные усилия, по крайней мере, такие же, как усилия, которые потребуются для устранения перекоса ГСЧ (но это, вероятно, потребует больше усилий, так как вам придется одновременно запустить алгоритм и «победить» смещение).

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

person Giuseppe Cardone    schedule 30.09.2010
comment
Спасибо за Ваш ответ. Я думаю, что устранение перекоса будет стоить больше, чем просто использование более медленного, но лучшего ГСЧ. - person JohnPS; 30.09.2010
comment
Я отредактировал свой ответ, чтобы прояснить свою точку зрения (он был слишком длинным для комментария). Суть в следующем: энтропия алгоритма не может быть выше энтропии, обеспечиваемой ГСЧ, поэтому, даже если алгоритм работает со смещенными ГСЧ, вы должны повторно применить его столько раз, чтобы сжать достаточное количество действительно случайных бит - это вычислительное усилие не может быть меньше, чем усилие, необходимое для устранения перекоса ГСЧ (и на самом деле оно, вероятно, намного выше). - person Giuseppe Cardone; 30.09.2010
comment
Чтобы перемешать массив из 25 элементов, нам нужно взять необработанные случайные числа, а затем применить модуль 25, 24, 23, ..., 2. Это, по-видимому, добавляет случайности. Кроме того, повторное использование предыдущего перемешивания добавляет к состоянию, поэтому не можем ли мы думать об алгоритме перемешивания RNG +, использующем предыдущее перемешивание, как о генераторе случайной перестановки с большим количеством состояний, чем базовый RNG, и, следовательно, с большей случайностью? - person JohnPS; 01.10.2010
comment
Нет, не можем. (P) RNG - это алгоритм, который берет несколько действительно случайных битов (начальное число) и распределяет их энтропию по длинному потоку битов. Состояние ГСЧ гарантирует, что при заданном начальном значении N бит, ГСЧ будет выводить один из возможных выходов 2 ^ N и что каждое различное начальное число приводит к разному выходному потоку битов. Добавление большего количества битов состояния каким-либо образом (включая передачу их в алгоритм) не генерирует энтропию, на самом деле вы, вероятно, теряете некоторые, потому что ваше дополнительное состояние (в вашем случае положение карт) не предназначено для сопоставления нескольких битов энтропии с длинный псевдослучайный поток битов. - person Giuseppe Cardone; 01.10.2010
comment
Это не добавляет случайности в том смысле, что, если вы знаете начальное состояние, вы можете предсказать все последующие перестановки. Но если вы не знаете начальное семя, можете ли вы сказать, что, глядя на выходную последовательность перестановок, вы можете сказать, что они не являются действительно случайными, так же легко, как глядя на последовательность чисел, созданных базовым ГСЧ? Период перестановок длиннее, чем период ГСЧ, поэтому этот тест на случайность сложнее обмануть. - person JohnPS; 01.10.2010
comment
Я понимаю вашу точку зрения. Мне кажется, что это увеличит сложность пространства, но не сложность времени. Но я не уверен и не могу это доказать, поэтому мой совет: если вы не можете убедительно обосновать, почему использование нескольких перемешиваний является лучшим выбором, вам следует уменьшить перекос своего ГСЧ или использовать лучший - что лучше упражняться. В качестве примечания, вывод многих RNG можно предсказать, даже не зная их начального состояния, просто наблюдая за их прошлым выводом (например, см. springerlink.com/content/p4526x2j040m7j12 портал. acm.org/citation.cfm?id=1290930.1290938). - person Giuseppe Cardone; 02.10.2010
comment
Существует специальный класс генераторов случайных чисел, который, с учетом некоторых предположений, строго гарантирует, что их выходные данные не будут иметь утечки их внутреннего состояния. Эти ГСЧ называются CSPRNG (Криптографически стойкий ГСЧ). Если вы не можете рискнуть, что кто-то угадает состояние вашего RNG, вам следует использовать CSPRNG. И некоторые из них тоже довольно быстрые (например, ISAAC). - person Giuseppe Cardone; 02.10.2010
comment
Спасибо за всю информацию. Все это очень интересно, но мне не нужен сверхмощный криптографический ГСЧ. Мне действительно нужно только то, что производит все возможные перестановки с равной вероятностью. Кажется, что использование предыдущего перемешивания в последующих итерациях не повредит и более эффективно. И некоторых простых тестов должно хватить. - person JohnPS; 02.10.2010
comment
@JohnPS Мне кажется, что если вы повторяете одну и ту же перестановку несколько раз, то вы, по крайней мере потенциально, еще больше ограничиваете набор достижимых перестановок (помимо ограничения, вызванного небольшим периодом PRNG, который вы упоминаете в своем исходном сообщении, и небольшим набором доступных начальных значений), ограничивая те перестановки, которые являются квадратами (или кубами и т. д.) других перестановок. Интересно, может ли последовательное применение нескольких разных перестановок увеличить количество возможных перестановок? - person Simon; 16.03.2021
comment
Я предполагаю, что это связано с порождающими наборами для симметричной группы из n символов и длинами слов относительно этих порождающих наборов. - person Simon; 16.03.2021

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

Что произойдет, если вы убедитесь, что количество случайных чисел, извлеченных из вашего ГСЧ для каждой итерации Фишера-Йейтса, имеет наибольшее наименьшее общее кратное с периодом ГСЧ? Это может означать, что вы «тратите впустую» случайное целое число в конце алгоритма. При перемешивании 25 элементов вам нужно 24 случайных числа. Если вы вытащите еще одно случайное число в конце, получив 25 случайных чисел, вам не гарантировано, что повторение будет намного дольше, чем период ГСЧ. Теперь, случайным образом, вы могли бы, конечно, встретить одни и те же 25 чисел подряд до достижения точки. Но поскольку у 25 нет общих множителей, кроме 1 с 2 ^ 32, вы не получите гарантированного повторения до 25 * (2 ^ 32). Это небольшое улучшение, но вы сказали, что этот ГСЧ быстрый. Что, если бы стоимость «отходов» была намного больше? Получить каждую перестановку по-прежнему может быть непрактично, но вы можете по крайней мере увеличить число, которое вы можете достичь.

person Andrew    schedule 29.09.2010
comment
Это интересное наблюдение. Я предполагаю, что повторные перестановки обычно не проблема. Я думаю, что перетасовка ранее перетасованного массива могла только увеличить период между повторами. - person JohnPS; 30.09.2010

Это полностью зависит от предвзятости. В общем, я бы сказал «не рассчитывайте на это».

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

Половину времени ничего не делайте, а вторую половину перетасовывайте правильно. Экспоненциально сходится к объективной. После n перемешиваний существует вероятность 1-1 / 2 ^ n, что перемешивание не является смещенным, и вероятность 1/2 ^ n входной последовательности была выбрана.

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

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

Более общий пример:

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

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

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

person Craig Gidney    schedule 30.09.2010
comment
Перемешайте все элементы, кроме последнего. Но я спрашиваю, а что, если алгоритм перемешивания не предвзят, а базовый ГСЧ - нет? Возможно, это то, о чем вы говорили в прошлой части. Я мог бы поверить, что последовательные перестановки могут быть коррелированы, если ГСЧ смещен, но я думаю, что ГСЧ должно быть довольно плохо, чтобы заметить, просто глядя на перестановки. Думаю, чтобы знать наверняка, нужно тестирование. - person JohnPS; 30.09.2010
comment
Предполагая, что функция перемешивания не имеет недостижимых перестановок, ГСЧ можно использовать для моделирования любого алгоритма, который вы хотите. - person Craig Gidney; 01.10.2010