[Haskell-cafe] Linear shuffle
Henning Thielemann
iakd0 at clusterf.urz.uni-halle.de
Fri Jan 14 09:18:01 EST 2005
On Fri, 14 Jan 2005, Scott Turner wrote:
> The shuffling algorithms mentioned so far are comparable to
> insertion/selection sort. I had come up with a shuffler that relates to
> quicksort, in that it partitions the input randomly into lists and works
> recursively from there. It looks efficient and works out well in Haskell.
I did some shuffling based on mergesort, that is a list is randomly split
(unzipped) into two lists and the parts are concatenated afterwards. You
must repeat this some times. It even works for infinite lists. It doesn't
need IO.
> randomPermute :: RandomGen g => [a] -> g -> ([a],g)
> randomPermute x g0 =
> let (choices,g1) = runState (mapM (const (State (randomR
(False,True)))) x) g0
> xc = zip x choices
> in (map fst (filter snd xc ++ filter (not . snd) xc), g1)
More information about the Haskell-Cafe
mailing list