A distribution using weighted sampling to pick a discretely selected
item.
Sampling a WeightedIndex
distribution returns the index of a randomly
selected element from the iterator used when the WeightedIndex
was
created. The chance of a given element being picked is proportional to the
value of the element. The weights can use any type X
for which an
implementation of Uniform<X>
exists.
A WeightedIndex<X>
contains a Vec<X>
and a Uniform<X>
and so its
size is the sum of the size of those objects, possibly plus some alignment.
Creating a WeightedIndex<X>
will allocate enough space to hold N - 1
weights of type X
, where N
is the number of weights. However, since
Vec
doesn't guarantee a particular growth strategy, additional memory
might be allocated but not used. Since the WeightedIndex
object also
contains, this might cause additional allocations, though for primitive
types, ['Uniform`] doesn't allocate any memory.
Time complexity of sampling from WeightedIndex
is O(log N)
where
N
is the number of weights.
Sampling from WeightedIndex
will result in a single call to
Uniform<X>::sample
(method of the [Distribution
] trait), which typically
will request a single value from the underlying RngCore
, though the
exact number depends on the implementaiton of Uniform<X>::sample
.
use rand::prelude::*;
use rand::distributions::WeightedIndex;
let choices = ['a', 'b', 'c'];
let weights = [2, 1, 1];
let dist = WeightedIndex::new(&weights).unwrap();
let mut rng = thread_rng();
for _ in 0..100 {
println!("{}", choices[dist.sample(&mut rng)]);
}
let items = [('a', 0), ('b', 3), ('c', 7)];
let dist2 = WeightedIndex::new(items.iter().map(|item| item.1)).unwrap();
for _ in 0..100 {
println!("{}", items[dist2.sample(&mut rng)].0);
}
Creates a new a WeightedIndex
[Distribution
] using the values
in weights
. The weights can use any type X
for which an
implementation of Uniform<X>
exists.
Returns an error if the iterator is empty, if any weight is < 0
, or
if its total value is 0.
Generate a random value of T
, using rng
as the source of randomness.
Important traits for DistIter<'a, D, R, T>
impl<'a, D, R, T> Iterator for DistIter<'a, D, R, T> where
D: Distribution<T>,
R: Rng + 'a, type Item = T;
Create an iterator that generates random values of T
, using rng
as the source of randomness. Read more
Performs copy-assignment from source
. Read more
Formats the value using the given formatter. Read more
Creates owned data from borrowed data, usually by cloning. Read more
🔬 This is a nightly-only experimental API. (toowned_clone_into
)
recently added
Uses borrowed data to replace owned data, usually by cloning. Read more
🔬 This is a nightly-only experimental API. (try_from
)
The type returned in the event of a conversion error.
🔬 This is a nightly-only experimental API. (try_from
)
Immutably borrows from an owned value. Read more
🔬 This is a nightly-only experimental API. (get_type_id
)
this method will likely be replaced by an associated static
🔬 This is a nightly-only experimental API. (try_from
)
The type returned in the event of a conversion error.
🔬 This is a nightly-only experimental API. (try_from
)
Mutably borrows from an owned value. Read more