Изменения

Перейти к: навигация, поиск
Неправильные способы реализации
==Неправильные способы реализации==
Небольшая модификация этого алгоритма, может резко сказаться на его корректности. Например, следующие два алгоритма работают неправильно Пример неправильной реализации:
'''for''' i = n '''downto''' 1
swap(i, random(1..n))
В данном случае число способов сгенерировать последовательность равно <tex>n^n</tex>, в то время как существует всего <tex> n!</tex> возможных перестановок из <tex> n</tex> элементов. Поскольку <tex> n^n</tex> никогда не может делиться на <tex> n!</tex> без остатка при <tex> n > 2</tex> (так как <tex> n!</tex> делится на число <tex> n - 1</tex> , которое не имеет с <tex> n</tex> общих простых делителей), то некоторые перестановки должны появляться чаще, чем другие.
Другой пример неправильной реализации:
'''for''' i = n '''downto''' 1
swap(random(1..n), random(1..n))
В самом деле: Теперь уже число способов сгенерировать последовательность в первом случае равно <tex>(n^2)^n</tex>. По той же причине, в то время как существует всего <tex> n!</tex> возможных перестановок из <tex> n</tex> элементов. Поскольку что и раньше <tex> (n^2)^n</tex> никогда не может делиться делится на <tex> n!</tex> без остатка при <tex> n > 2</tex> (так как <tex> n!</tex> делится на число <tex> n - 1</tex> , которое не имеет с <tex> n</tex> общих простых делителей), то следовательно некоторые перестановки должны будут появляться еще чаще, чем другие. Аналогично для второго случая, где число способов сгенерировать последовательность равно уже <tex> (n^2)^n</tex>
==См.также==
39
правок

Навигация