静态(假)随机发生器

时间:2012-01-27 11:30:42

标签: haskell random

为了测试RandomGen - reliant函数的目的,我需要一个RandomGen实例,它将在实例化时返回我告诉它的数字,这样我就可以将测试函数的结果与正确的函数进行比较那些。即在每次调用random时,我希望此函数返回列表[5, 8, 2, 6, 6]中的下一个数字(如果它到达结尾可能会引发错误,或者它可能会循环)。我希望创建该生成器的实例就像StaticGen [5, 8, 2, 6, 6]一样。

我想知道是否存在这样的图书馆,或者我是否应该在我的测试中采取一些不同的方法。

关于更新:事实证明我最初通过指定next函数而不是random作为我想要从列表中返回值的函数来说错了。我道歉。

1 个答案:

答案 0 :(得分:5)

好吧,你可以发布这样一个库。但它会很短。

newtype StaticGen = StaticGen [Int]
instance RandomGen StaticGen where
  next (StaticGen (x:xs)) = (x, StaticGen xs)
  next _ = error "No more random numbers!"
  split x = (x, x)           -- broken, but irrelevant
  genRange _ = (0, maxBound) -- choose your own

好吧,如上所述,这不会告诉你传入的序列。你可以重写你的函数,所以不要采用这样的随机数生成器:

myFunction :: RandomGen g => g -> a -> (b, g)

他们这样工作:

myFunction :: forall g. (g -> (Int, g)) -> g -> a -> (b, g)

这样你可以将它与随机数生成器一起使用:

myFunction random g a

或者您可以将其与列表一起使用:

myFunction (\(x:xs) -> (x, xs)) [1,2,3,4] a