gpt4 book ai didi

f# - 如何在 FsCheck 中生成概率

转载 作者:行者123 更新时间:2023-12-02 01:45:52 25 4
gpt4 key购买 nike

我想测试一个属性,我使用 2 个概率 p1 和 p2 必须满足 0 < p1 < p2 < 1

let arraySizeCheck (p1:float, p2:float, xs:list<int>) =
(p1 < p2 && p1 > 0.0 && p1 < 1.0 && p2 > 0.0 && p2 < 1.0 && Seq.length xs > 0) ==>
(lazy
(
let bf1 = BloomFilter(p1, xs)
let bf2 = BloomFilter(p2, xs)
bf2.BitArraySize < bf1.BitArraySize
)
)

Check.Quick arraySizeCheck

我试过上面的例子但是测试结果好像是

Arguments exhausted after 0 tests. val it : unit = ()

此外,我希望列表 xs 不包含重复项。任何对此属性编写测试的帮助将不胜感激。谢谢。

最佳答案

更惯用的方法是使用 gen来自 Gen 的计算表达式和组合器函数模块。不幸的是,返回生成随机 float 的生成器的函数是隐藏的(参见 source code。)

但我们可以创建自己的:

open System
open FsCheck
open FsCheck.Gen
open FsCheck.Prop

/// Generates a random float [0..1.0]
let rand = Gen.choose (0, Int32.MaxValue) |> Gen.map (fun x -> double x / (double Int32.MaxValue))

/// Generates a random float in the given range (inclusive at both sides)
let randRange a b = rand |> Gen.map (fun x -> a + (b - a) * x)

let arraySizeCheck =
Prop.forAll
(Arb.fromGen <| gen {
// generate p1 and p2 such that 0 <= p1 <= p2 <= 1
let! p1 = randRange 0.0 1.0
let! p2 = randRange p1 1.0

// generate non-empty Seq<int>
let! xs = Gen.nonEmptyListOf Arb.generate<int> |> Gen.map Seq.ofList

return BloomFilter(p1, xs), BloomFilter(p2, xs)
})
(fun (bf1, bf2) -> bf2.BitArraySize < bf1.BitArraySize)

Check.Quick arraySizeCheck

请注意 p1p2这里生成了 0 <= p1 <= p2 <= 1 ,这不正是您所需要的。但我认为对 rand 进行简单修改函数可以解决这个问题。

关于f# - 如何在 FsCheck 中生成概率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25732468/

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