pub fn random_b_tree_sets_length_range<I: Iterator>(
seed: Seed,
a: u64,
b: u64,
xs_gen: &dyn Fn(Seed) -> I,
) -> RandomBTreeSets<I::Item, RandomUnsignedRange<u64>, I> ⓘExpand description
Generates random BTreeSets with lengths in $[a, b]$, using elements from an iterator.
The lengths of the BTreeSets are sampled from a uniform distribution on $[a, b)$. $a$ must
be less than or equal to $b$.
The input iterator must generate at least $b$ distinct elements.
$$ P((x_i)_{i=0}^{n-1}, a, b) = \frac{n!}{b - a + 1}\prod_{i=0}^{n-1}P(x_i). $$
xs_gen must be infinite.
§Expected complexity per iteration
$T(i) = O(b \log b \cdot T^\prime(i))$
$M(i) = O(b M^\prime(i))$
where $T$ is time, $M$ is additional memory, $i$ is the iteration number, $T^\prime$ and
$M^\prime$ are the time and memory functions of the iterators produced by xs_gen, and $b$ is
b.
If xs can repeat values, extra draws are needed to reach the required number of distinct
elements, and an iteration fails to terminate if fewer distinct values are reachable than the
requested length.
§Panics
Panics if $a \geq b$.
§Examples
use itertools::Itertools;
use malachite_base::num::random::random_primitive_ints;
use malachite_base::random::EXAMPLE_SEED;
use malachite_base::sets::random::random_b_tree_sets_length_range;
use maplit::btreeset;
let xs = random_b_tree_sets_length_range(EXAMPLE_SEED, 2, 5, &random_primitive_ints::<u8>);
let values = xs.take(20).collect_vec();
assert_eq!(
values,
&[
btreeset! {11, 85, 136},
btreeset! {134, 200, 203, 235},
btreeset! {38, 223, 235},
btreeset! {32, 162, 177, 217},
btreeset! {30, 166, 218, 234},
btreeset! {9, 90, 106},
btreeset! {204, 216},
btreeset! {97, 151, 213},
btreeset! {78, 253},
btreeset! {39, 91, 175, 191},
btreeset! {2, 170, 232, 233},
btreeset! {22, 35, 217},
btreeset! {17, 32, 114, 198},
btreeset! {65, 114, 173},
btreeset! {25, 121, 173, 222},
btreeset! {79, 115, 144, 148},
btreeset! {52, 69, 73, 137},
btreeset! {91, 153},
btreeset! {34, 95, 112, 178},
btreeset! {106, 167}
]
);