Stas, строго говоря, твой код не обеспечивает равновероятность перестановок. Ты просто идешь по массиву и на каждом шаге текущий элемент переставляешь с произвольным. Допустим, у нас массив 2*2, то есть 4 элемента. Всего может быть 24 (4!) перестановки. А твоя программа выдаст 256 комбинаций (4*4*4*4). 256 не делится на 24 без остатка, а значит, некоторые комбинации будут появляться чаще, чем остальные.
А тот алгоритм, что я привел, даст ровно 24 комбинации: на первом шаге мы вибираем один элемент из 4, на втором произвольный и трех оставшихся, затем один из двух. И достаточно легко показать, что все варианты равновероятны.
На самом деле, если число элеметов массива больше 3, то практически разница будет несущественна. Но зачем использовать плохой алгоритм, если есть хороший с такой же сложностью.