我想用proptest生成 DAG 。我选择的算法是this。我在下面编写了简单的算法——但我需要帮助将其转换为proptest 策略。
与以下代码相同但不使用随机数生成器的策略需要看起来像什么?(不言而喻,随机数生成器不适合基于属性的测试。)
没有 proptest 策略的标准代码:(https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=2de4a757a96d123bf83b5157e0633d33)
use rand::Rng;
fn main() {
println!("{:?}", random_vec_of_vec());
}
fn random_vec_of_vec() -> Vec<Vec<u16>> {
const N: u16 = 30;
const K: usize = 3;
let mut rng = rand::thread_rng();
let length: u16 = rng.gen_range(0, N);
let mut outer = vec![];
for index in 1..length {
let mut inner = vec![0u16; rng.gen_range(0, K)];
for e in &mut inner {
*e = rng.gen_range(0, index);
}
// De-duplicate elements. Particularly a problem with `index < K`.
inner.sort();
inner.dedup();
outer.push(inner);
}
outer
}
之前的工作
我尝试使用vec函数,但我需要嵌套两个vec
函数。而且,内部 vec 函数只能生成直到外部向量中索引的值。
use proptest::collection::vec;
// INDEX should be the value of the position of the inner vector
// in the outer vector. How could the be found?
let strategy = vec(vec(1..INDEX, 0..K), 0..N);
该index
方法没有帮助,因为仍然不知道正确的大小。