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' の位置が変わっていない