静态(假)随机发生器

Nik*_*kov 2 random haskell

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

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

在更新:事实证明我最初通过指定next函数而不是random我希望从列表中返回值的函数来说错了.我很抱歉.

Die*_*Epp 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
Run Code Online (Sandbox Code Playgroud)

好吧,如上所述,这不会给你传递的序列.你可以重写你的函数,所以不要像这样采用随机数生成器:

myFunction :: RandomGen g => g -> a -> (b, g)
Run Code Online (Sandbox Code Playgroud)

他们这样工作:

myFunction :: forall g. (g -> (Int, g)) -> g -> a -> (b, g)
Run Code Online (Sandbox Code Playgroud)

这样你可以使用随机数生成器:

myFunction random g a
Run Code Online (Sandbox Code Playgroud)

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

myFunction (\(x:xs) -> (x, xs)) [1,2,3,4] a
Run Code Online (Sandbox Code Playgroud)