07/01/11 23:09:05
>>465
こんな感じになった。やたらと面倒だったので改善案募集。
{-# OPTIONS_GHC -fglawgow-exts #-}
module Test where
import System.Random
import Data.Array.IArray
import Data.Array.ST
import Control.Monad.ST
hoge :: forall a i e. (IArray a e, Ix i, Random i) => a i e -> StdGen -> (a i e, StdGen)
hoge ia gi = runST act
where
act :: forall s. ST s (a i e, StdGen)
act = do
ma <- thaw ia
let _ = ma :: STArray s i e
g' <- shuffle ma gi first
ra <- unsafeFreeze ma
return (ra, g')
(first, last) = bounds ia
shuffle a g i = case ran of
[] -> return g
_:next:_ -> do
let (j, g') = randomR (i, last) g
x <- readArray a i
y <- readArray a j
writeArray a i y
writeArray a j x
shuffle a g' next
where
ran = range (i, last)