我想用proptest生成DAG。我选择的算法为this。我已经在下面编写了简单的算法-但我需要帮助将其转换为 protest strategy。
与以下代码相同但不使用随机数生成器的策略需要看起来像什么? (不用说,随机数生成器对于基于属性的测试不利。)
没有抗议策略的标准代码: (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
方法没有帮助,因为正确的大小仍然未知。