假设我有一个基于的生成器,System.Random
并且我想将它变成一个 FsCheck 生成器:
let myGen = MyGen(System.Random())
let fsGen = gen { return myGen.Generate() }
这个简单的解决方案有几个问题:首先是忽略了大小的概念;我认为这不是一个大问题,许多生成器忽略了大小。另一个问题会影响可重复性,因为 FsCheck 生成器是底层的纯函数,随机性仅由测试运行器中的采样机制提供。(这在这个答案中有清楚的解释)。
现在,一个解决方案可能是:
let fsGen =
gen {
let! seed = Gen.choose(0, System.Int32.MaxValue)
let myGen = MyGen(System.Random(seed))
return myGen.Generate() }
但是有性能损失,因为我MyGen
每次都必须创建一个新实例(初始化成本可能很高)
有更好的办法吗?