pub fn random_ordered_unique_vecs_from_length_iterator<T: Ord, I: Iterator<Item = u64>, J: Iterator<Item = T>>(
seed: Seed,
lengths_gen: &dyn Fn(Seed) -> I,
xs_gen: &dyn Fn(Seed) -> J
) -> RandomOrderedUniqueVecs<T, I, J>ⓘNotable traits for RandomOrderedUniqueVecs<T, I, J>impl<T: Ord, I: Iterator<Item = u64>, J: Iterator<Item = T>> Iterator for RandomOrderedUniqueVecs<T, I, J> type Item = Vec<T>;
Expand description
Generates random Vec
s using elements from an iterator and with lengths from another
iterator, where the Vec
s have no repeated elements, and the elements are in ascending
order.
The input iterator must generate at least many distinct elements as any number generated by the lengths iterator; otherwise, this iterator will hang.
$$ P((x_i)_{i=0}^{n-1}) = n!P(n)\prod_{i=0}^{n-1}P(x_i). $$
The above formula assumes that the Vec
is valid, \emph{i.e.} its elements are strictly
increasing. The probability of an invalid Vec
is zero.
lengths
and xs
must be infinite.
Examples
extern crate itertools;
use itertools::Itertools;
use malachite_base::num::random::random_primitive_ints;
use malachite_base::random::EXAMPLE_SEED;
use malachite_base::vecs::random::random_ordered_unique_vecs_from_length_iterator;
use malachite_base::vecs::random_values_from_vec;
let xs = random_ordered_unique_vecs_from_length_iterator(
EXAMPLE_SEED,
&|seed| random_values_from_vec(seed, vec![0, 2, 4]),
&random_primitive_ints::<u8>,
);
let values = xs.take(20).collect_vec();
assert_eq!(
values.iter().map(Vec::as_slice).collect_vec().as_slice(),
&[
&[11, 85][..],
&[134, 136, 200, 235],
&[203, 223],
&[38, 177, 217, 235],
&[32, 162, 166, 234],
&[30, 218],
&[],
&[90, 106],
&[],
&[9, 151, 204, 216],
&[78, 97, 213, 253],
&[39, 91],
&[170, 175, 191, 232],
&[2, 233],
&[22, 35, 198, 217],
&[17, 32, 114, 173],
&[65, 114, 121, 222],
&[],
&[25, 144, 148, 173],
&[]
]
);