gpt4 book ai didi

f# - 使用 FSCheck 生成器

转载 作者:行者123 更新时间:2023-12-05 01:31:02 27 4
gpt4 key购买 nike

我有一个函数可以在一个范围内生成 double :

let gen_doublein = 
fun mx mn -> Arb.generate<float> |> Gen.suchThat ( (>) mx ) |> Gen.suchThat ( (<) mn )

然后是一个函数来生成其中 2 个的数组:
let gen_params:Gen<double array> = 
gen { let! x = gen_doublein 0.0 20000.0
let! y = gen_doublein 0.0 2000.0
return [| x;y|] }

我放:
static member arb_params = Arb.fromGen  gen_params

在 Generator 类中并注册它。一切似乎都很好。为了测试这一切正常,我有:
let f2 (xs:double array) :double= exp (-2.0*xs.[0]) + xs.[1]*exp (-2.0*xs.[0])
let fcheck fn xs = fn xs > 0.0

然后使用数组生成器“arrayOfLength”:
Check.Quick (Prop.forAll (arrayOfLength 2) (fcheck f2))

但是,按预期工作:
Check.Quick (Prop.forAll (Generators.arb_params) (fcheck f2))

只是开始做一些计算,永远不会回来。 f# 大师请帮忙。

最佳答案

我没有尝试这个,但我认为问题是生成器创建了 float随机值,然后检查它们是否与您指定的谓词(范围)匹配。这意味着它必须在(随机)生成匹配的浮点数之前生成大量浮点数。

通过生成 float 在指定范围内生成值会更容易范围内的值 [0 .. 1]
然后重新缩放它们以匹配您需要的范围。

我对 FsCheck 不够熟悉,所以我不知道是否有 [0 .. 1] 浮点范围的生成器,但是您可以从生成整数并将它们转换为浮点数开始:

let gen_doublein mx mn = gen {
let! n = Arb.generate<int>
let f = float n / float Int32.MaxValue
return mx + (f * (mn - mx)) }

编辑 我看到你已经解决了这个问题。我认为我发布的解决方案可能仍然适用于较小的范围(其中随机生成器没有足够快地产生足够的匹配值)。

关于f# - 使用 FSCheck 生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9790108/

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