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

この記事は筆者が見た夢を一人称視点で叙述した内容です。事実ではなく、実際の人物等とは一切関係ありません。

うまくいえないけど。 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 を期待している。たぶん大丈夫なはず…。