gpt4 book ai didi

f# - 将基于 System.Random 的生成器转换为 FsCheck 生成器

转载 作者:行者123 更新时间:2023-12-04 02:18:01 24 4
gpt4 key购买 nike

假设我有一个基于 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 实例(初始化成本可能很高)

有什么更好的方法吗?

最佳答案

以下可以工作吗?尽管MyGen本质上是随机的,您可以通过固定种子使其具有确定性:

let deterministicGen = MyGen(Random(42))

由于 Random 的性质,这不能保证具有足够随机的分布,但如果它符合您的目的,您可以创建由 MyGen 生成的确定性值序列:

let deterministicValues = List.init 100 (fun _ -> deterministicGen.Generate())

这只是 100 个值,但根据您的需要,您可以创建包含 1000 个或什至 10000 个值的更大样本集。

就像deterministicGen , deterministicValues是固定的:它是由 MyGen 生成的值列表.

您可以轻松地要求 FsCheck 从这个列表中随机选择值:

let fsGen = Gen.elements deterministicValues

在这里,fsGen是一个 Gen<'a> , 其中'a是什么MyGen.Generate()返回。

关于f# - 将基于 System.Random 的生成器转换为 FsCheck 生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32864143/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com