【发布时间】:2012-04-10 07:14:10
【问题描述】:
几周前才开始使用 Haskell - 我试图通过在随机点 int eh 列表中将列表分成两个来随机打乱 Card 类型的列表(取决于 randomList 函数产生的随机整数数组) 并多次交换这两个部分的顺序,但输出完全不是随机的,解析似乎只发生一次,非常绝望,因为我需要它工作,截止日期是今晚!
randomList :: (Random a) => (a,a) -> Int -> StdGen -> [a]
randomList bnds n = take n . randomRs bnds
randomise :: [Int] -> [Card] -> [Card]
randomise [] p = p
randomise (x : xs) p = do
randomise xs ((drop x p) ++ (take x p))
shuffle :: Int -> [Card] -> [Card]
shuffle r p = do
let g = mkStdGen r
randomise(randomList (1, (length p)-1) 500 g :: [Int]) p
【问题讨论】:
-
“截止日期”?如果这是家庭作业,您需要将其标记为这样。此外,您能解释一下“完全不随机”是什么意思吗?你如何确定输出的随机性?
-
您可能对Fisher-Yates shuffle 感兴趣。它可以很容易地适应链表。
-
这是课程作业,一个随机整数数组被输入randomise,这个数组的长度是500,卡片列表应该被拆分并重新排序500次
-
@RyanConnolly:是拆分和重新排序 500 次吗?如果不是,你怎么知道?
-
尝试用笔和纸完成
randomise [3,4,14,20] ['A'..'Z']的计算结果(想象type Card = Char用于此练习)。
标签: list haskell random shuffle