関数型プログラミング言語Haskell Part24
■ このスレッドは過去ログ倉庫に格納されています
0393デフォルトの名無しさん
2013/11/28(木) 22:29:06.51効率やシャッフルの質を重視するなら Fisher–Yates shuffle を使いところだが、
リストでエレガントにやる方法が思いつかなかった。
俺が考えると、どうしても泥臭くなる。
代わりに、こんなのはどうだろう。
pick :: [a] -> Int -> (a, [a])
pick xs i =
let (ys, ys') = splitAt i xs
in (head ys', ys ++ tail ys')
shuffle :: [a] -> IO [a]
shuffle [] = return []
shuffle xs = do
(y, ys) <- pick xs `fmap` (getStdRandom (randomR (0, length xs - 1)))
ys' <- shuffle ys
return (y : ys')
■ このスレッドは過去ログ倉庫に格納されています