順序の重複がないランダムなソート

うまくいえないけど。 a,b,c,d,... というアルファベットの羅列 (べつにアルファベットじゃなくてもいいけど) があって、それをもとのインデックスと同じインデックス以外にランダムに配置する、というソートをやってみる。

alphabet = ("a".."z").to_a.sort

randomized = alphabet.sort_by {|i|
  (pos = rand(alphabet.size - 1)) == alphabet.index(i) ? pos + 1 : pos
}

alphabet.zip(randomized).all? do |(i, j)|
  i == j
end # -> false

最後はソート済みの配列とランダムに配置した配列を zip した配列でインデックスごとに同じ要素が無いか、つまりランダムに配置したあとでインデックスが変わっていない要素が無いか、を確認している。
false を期待している。たぶん大丈夫なはず…。