乱数をくっつけてその乱数でソート
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
たぶん元ネタと同じ動作をすると思うのだけど,どうだろう.