stringtranslate.com

Случайная перестановка

Случайная перестановка — это случайное упорядочение набора объектов, то есть случайная величина со значением перестановки . Использование случайных перестановок распространено в азартных играх и в рандомизированных алгоритмах в теории кодирования , криптографии и моделировании . Хорошим примером случайной перестановки является честное тасование стандартной колоды карт : в идеале это случайная перестановка 52 карт.

Вычисление случайных перестановок

Методы входа-за-входом

Один из алгоритмов для генерации случайной перестановки множества размера n равномерно случайным образом , т. е. таким образом, чтобы каждая из n ! перестановок появлялась с равной вероятностью, заключается в генерации последовательности путем равномерного случайного выбора целого числа от 1 до n (включительно) последовательно и без замены n раз, а затем в интерпретации этой последовательности ( x 1 , ..., x n ) как перестановки

здесь показано в двухстрочной записи .

Неэффективный метод грубой силы для выборки без замены может выбирать из чисел от 1 до n на каждом шаге, повторяя выбор всякий раз, когда случайно выбранное число является повторением уже выбранного числа, пока не будет выбрано число, которое еще не было выбрано. Ожидаемое количество повторов на шаг в таких случаях будет масштабироваться с обратной величиной доли уже выбранных чисел, а общее количество повторов будет равно сумме этих обратных величин, что делает этот подход неэффективным.

Таких повторных попыток можно избежать, используя алгоритм, в котором на каждом i- м шаге, когда x 1 , ..., x i − 1 уже выбраны, выбирается равномерно случайное число j из диапазона от 1 до ni + 1 (включительно) и x i устанавливается равным j -му наибольшему из еще не выбранных чисел. Это делает выбор равномерно случайным образом среди оставшихся чисел на каждом шаге без повторных попыток.

Тасовки Фишера-Йейтса

Простой алгоритм для генерации перестановки из n элементов равномерно случайным образом без повторных попыток, известный как перестановка Фишера-Йетса , заключается в том, чтобы начать с любой перестановки (например, тождественной перестановки ), а затем пройти по позициям от 0 до n − 2 (мы используем соглашение, где первый элемент имеет индекс 0, а последний элемент имеет индекс n − 1), и для каждой позиции i поменять текущий элемент на случайно выбранный элемент из позиций с i по n − 1 (конец) включительно. Любая перестановка из n элементов будет произведена этим алгоритмом с вероятностью ровно 1/ n !, таким образом, давая равномерное распределение перестановок.

unsigned uniform ( unsigned m ); /* Возвращает случайное целое число 0 <= uniform(m) <= m-1 с равномерным распределением */   void initialize_and_permute ( unsigned permutation [], unsigned n ) { unsigned i ; for ( i = 0 ; i <= n -2 ; i ++ ) { unsigned j = i + uniform ( n - i ); /* Случайное целое число, такое что i ≤ j < n */ swap ( permutation [ i ], permutation [ j ]); /* Поменять местами случайно выбранный элемент с permutation[i] */ } }                        

Если uniform()функция реализована просто как random() % (m), то возникнет смещение в распределении перестановок, если число возвращаемых значений random()не кратно m. Однако этот эффект невелик, если число возвращаемых значений на random()порядки больше m.

Тестирование случайности

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

Статистика случайных перестановок

Фиксированные точки

Распределение вероятностей для числа неподвижных точек равномерно распределенной случайной перестановки из n элементов приближается к распределению Пуассона с ожидаемым значением 1 по мере роста n . [1] Первые n моментов этого распределения в точности соответствуют моменту распределения Пуассона. В частности, вероятность того, что случайная перестановка не имеет неподвижных точек (т. е. что перестановка является расстройством ) , приближается к 1/ e по мере роста n .

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

Ссылки

  1. ^ Дюрстенфельд, Ричард (1 июля 1964 г.). "Алгоритм 235: Случайная перестановка". Сообщения ACM . 7 (7): 420. doi : 10.1145/364520.364540 .

Внешние ссылки