随机化一个Haskell列表

时间:2016-05-04 02:40:07

标签: list haskell

我想编写一个Haskell程序,它将" ramdomize"列表中的元素:

import System.Random (getStdGen, randomRIO)
import Data.List (permutations)

rndElem :: [a] -> IO a
rndElem xs = do
  index <- randomRIO (0, length xs - 2)
  return $ xs !! index

rndPermutation :: [a] -> IO [a]
rndPermutation xs = rndElem . permutations $ xs

然而,运行此似乎并不完全随机化列表。由于某些原因,它仅使每个其他元素随机化,例如, [1,2,3,4,5,6] - &gt; [5,2,1,4,3,6]。这个算法的每次运行都将奇数索引(2,4,6)元素保持在同一个位置。上述算法的索引中是否有任何逻辑错误?

2 个答案:

答案 0 :(得分:2)

尝试运行此代码:

openRange

然后将7更改为6到5,依此类推。

希望这能解释我关于'2'的问题,也许这可以帮助你弄清楚代码在做什么。

答案 1 :(得分:0)

用于随机化有限列表的一个非常好的算法是Fisher-Yates shuffle, aka Knuth shuffle。这是来自Rosetta Code的Haskell version

o-n-i-d