Skip to main content

random_b_tree_sets_length_range

Function random_b_tree_sets_length_range 

Source
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> 
where I::Item: Ord,
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}
    ]
);