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