如何将 Quickcheck 生成的浮点数限制在一个范围内?

Ale*_*sti 1 testing rust

我想为Quickcheck生成随机浮点数,这些浮点数限制在某个范围内,例如 0.0 到 1.0,用于测试处理概率的函数。我希望能够做一些成功的事情:

quickcheck! {        
    fn prop(x: f64, y: f64) -> bool {
        assert!(x <= 1.0);
        assert!(y <= 1.0);

        (x * y < x) && (x * y < y)
    }
}
Run Code Online (Sandbox Code Playgroud)

She*_*ter 5

创建一个代表你想要的范围的新类型,然后quickcheck::Arbitrary为它实现:

#[macro_use]
extern crate quickcheck;

#[derive(Debug, Copy, Clone)]
struct Probability(f64);

impl quickcheck::Arbitrary for Probability {
    fn arbitrary<G: quickcheck::Gen>(g: &mut G) -> Self {
        Probability(g.gen_range(0.0, 1.0))
    }
}

quickcheck! {
    fn prop(x: Probability, y: Probability) -> bool {
        let x = x.0;
        let y = y.0;

        assert!(x <= 1.0);
        assert!(y <= 1.0);

        (x * y < x) && (x * y < y)
    }
}
Run Code Online (Sandbox Code Playgroud)

Arbitrary传递了一个实现的类型quickcheck::Gen,它是rand::Rng.

请注意,它Rng::gen_range有一个唯一的上限,所以这个例子并不完全是你想要的,但它显示了这个过程。