for (int i = 0; i < array.length; i++) {
int dst = (int) Math.floor(Math.random() * (i + 1));

(i+1)ではなく、(array.length+1)でやってみてはどうだろうか?
にしても、落とし穴も何も、それがどういう並び替えかくらい分かっているだろ。
どれを選ぼうが、最終的には擬似乱数発生ライブラリに依存する以上、
何かしらそれに応じて偏りはある。