読者です 読者をやめる 読者になる 読者になる

オリジナルと同じインデックスに同じ要素が現れないソート

unsorted = ('a'..'z').to_a.sort

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

unsorted.zip(randomized).all? {|(i, j)|
  i == j
} # -> false

小文字のアルファベットが降順にソートされた配列 A を考える。これをシャッフルしたいのだけど、シャッフルした配列 B の要素のインデックス (位置) が、オリジナルである配列 A と一緒では困る、という場合。

array_A = ['a', 'b', 'c', 'd', 'e', 'f']
                 |
array_B = ['c', 'b', 'e', 'a', 'f', 'd'] # 'b' の位置が変わっていない