【问题标题】:How to generate probability rates in FsCheck如何在 FsCheck 中生成概率率
【发布时间】:2014-11-02 03:46:35
【问题描述】:

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

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

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

参数在 0 次测试后用尽。 验证它:单位 = ()

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

【问题讨论】:

    标签: f# fscheck


    【解决方案1】:

    更惯用的方法是使用gen 计算表达式和Gen 模块中的组合函数。不幸的是,返回生成随机浮点数的生成器的函数被隐藏了(参见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 &lt;= p1 &lt;= p2 &lt;= 1 并不是您所需要的。但我认为对rand 函数的简单修改可以解决这个问题。

    【讨论】:

    • Arb.Default.Float() 是默认的浮动任意实例。它有一个属性 Generator 来获取随机生成器,以及 Shrinker 来获取默认的浮动收缩器。
    • @KurtSchelfthout,如何在 [0; 1] 范围?
    • (很抱歉错过了这个)。它非常微妙:let f = Arb.generate |> Gen.map float |> Gen.resize 5 |> Gen.map abs |> Gen.suchThat (fun f -> f Gen.样品 100 10
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 2019-06-21
    • 2012-01-10
    • 2014-10-06
    • 2021-11-05
    • 1970-01-01
    相关资源
    最近更新 更多