sort関数を使って配列をシャッフルする

sort関数の比較操作をワンライナーで可視化してみた - すぎゃーんメモに続き、sort関数ネタ。
なんとなく、sort関数のBLOCKを出鱈目にすればshuffle的なことが出来るんじゃないのかな?と思いついて。
やっぱり既にそういう考え方はあるようで。
配列をランダムに並び替える。かっこいいスクリプト : blog.nomadscafe.jp
配列をシャッフル(ランダムソート)する - くれすのPerl日記 - Hatena::Group::Perl


ワンライナーでやると、こんなカンジ?

$ perl -le 'print join $", sort { int(rand 3) - 1 } 0..9'
1 0 4 7 6 5 3 2 8 9

-1, 0, 1のいずれかを返すのならこういう方法もアリかな

$ perl -le 'print join $", sort { rand(3) % 3 - 1 } 0..9'
2 4 5 6 8 7 1 0 3 9

どちらでもそれっぽく混ざっているようだ。


しかし、比較結果が0になる組が存在しないのにランダムの結果で0が出てくるのも変かな?

$ perl -le 'print join $", sort { int(rand 2) * 2 - 1 } 0..9'
1 8 0 3 7 9 2 5 4 6
$ perl -le 'print join $", sort { rand(2) % 2 * 2 - 1 } 0..9'
9 7 5 6 4 3 8 1 0 2

というやり方でもいいのかも。


まぁ、素直にコアモジュールList::Utilのshuffleを使うべきなんですけどね。

$ perl -MList::Util=shuffle -le 'print join $", shuffle 0..9'
1 6 3 9 4 0 7 8 5 2