【发布时间】:2015-09-30 10:47:02
【问题描述】:
假设给了我一个基于System.Random 的生成器,我想把它变成一个 FsCheck 生成器:
let myGen = MyGen(System.Random())
let fsGen = gen { return myGen.Generate() }
这个简单的解决方案有几个问题: 一是忽略了大小的概念;我认为这不是一个大问题,许多生成器忽略了大小。 另一个问题会影响可重复性,因为 FsCheck 生成器是底层的纯函数,随机性 仅由测试运行程序中的采样机制提供。 (这在this answer中有明确解释)。
现在,一个解决方案可能是:
let fsGen =
gen {
let! seed = Gen.choose(0, System.Int32.MaxValue)
let myGen = MyGen(System.Random(seed))
return myGen.Generate() }
但是有性能损失,因为我每次都必须创建一个 MyGen 的新实例(初始化成本可能很高)
有更好的方法吗?
【问题讨论】:
-
我想重新设计
MyGet是不可能的? -
只要
MyGen从外部获取Random实例,我们就可以通过像您建议的那样传递Random(42)或传递从FsCheck 构建的实例将其转换为确定性函数随机上下文就像我的例子中一样