乱数をくっつけてその乱数でソート

2回連続で mzp さんのエントリが元ネタ: http://d.hatena.ne.jp/mzp/20090729/shuffle
同じく Haskell で.State とか使わずに素直に「乱数をくっつけてその乱数でソート」を実装してみた.

import System.Random
import Data.List (sortBy)
import Data.Function (on)

shuffle :: RandomGen g => g -> [a] -> [a]
shuffle g = map snd . sortBy (compare `on` fst) . zip (randoms g :: [Int])

shuffleIO :: [a] -> IO [a]
shuffleIO xs = do
  g <- newStdGen
  return $ shuffle g xs

たぶん元ネタと同じ動作をすると思うのだけど,どうだろう.