Trait IndexedRandom
trait IndexedRandom: Index<usize>
Extension trait on indexable lists, providing random sampling methods.
This trait is implemented on [T] slice types. Other types supporting
[std::ops::Index<usize>] may implement this (only Self::len must be
specified).
Required Methods
fn len(self: &Self) -> usizeThe length
Provided Methods
fn is_empty(self: &Self) -> boolTrue when the length is zero
fn choose<R>(self: &Self, rng: &mut R) -> Option<&<Self as >::Output> where R: Rng + ?SizedUniformly sample one element
Returns a reference to one uniformly-sampled random element of the slice, or
Noneif the slice is empty.For slices, complexity is
O(1).Example
use IndexedRandom; let choices = ; let mut rng = rng; println!; assert_eq!;fn choose_multiple<R>(self: &Self, rng: &mut R, amount: usize) -> SliceChooseIter<'_, Self, <Self as >::Output> where <Self as >::Output: Sized, R: Rng + ?SizedUniformly sample
amountdistinct elements from selfChooses
amountelements from the slice at random, without repetition, and in random order. The returned iterator is appropriate both for collection into aVecand filling an existing buffer (see example).In case this API is not sufficiently flexible, use
index::sample.For slices, complexity is the same as
index::sample.Example
use IndexedRandom; let mut rng = &mut rng; let sample = "Hello, audience!".as_bytes; // collect the results into a vector: let v: = sample.choose_multiple.cloned.collect; // store in a buffer: let mut buf = ; for in sample.choose_multiple.zipfn choose_multiple_array<R, N: usize>(self: &Self, rng: &mut R) -> Option<[<Self as >::Output; N]> where <Self as >::Output: Clone + Sized, R: Rng + ?SizedUniformly sample a fixed-size array of distinct elements from self
Chooses
Nelements from the slice at random, without repetition, and in random order.For slices, complexity is the same as
index::sample_array.Example
use IndexedRandom; let mut rng = &mut rng; let sample = "Hello, audience!".as_bytes; let a: = sample.choose_multiple_array.unwrap;fn choose_weighted<R, F, B, X>(self: &Self, rng: &mut R, weight: F) -> Result<&<Self as >::Output, WeightError> where R: Rng + ?Sized, F: Fn(&<Self as >::Output) -> B, B: SampleBorrow<X>, X: SampleUniform + Weight + PartialOrd<X>Biased sampling for one element
Returns a reference to one element of the slice, sampled according to the provided weights. Returns
Noneonly if the slice is empty.The specified function
weightmaps each itemxto a relative likelihoodweight(x). The probability of each item being selected is thereforeweight(x) / s, wheresis the sum of allweight(x).For slices of length
n, complexity isO(n). For more information about the underlying algorithm, see theWeightedIndexdistribution.See also
choose_weighted_mut.Example
use *; let choices = ; let mut rng = rng; // 50% chance to print 'a', 25% chance to print 'b', 25% chance to print 'c', // and 'd' will never be printed println!;fn choose_multiple_weighted<R, F, X>(self: &Self, rng: &mut R, amount: usize, weight: F) -> Result<SliceChooseIter<'_, Self, <Self as >::Output>, WeightError> where <Self as >::Output: Sized, R: Rng + ?Sized, F: Fn(&<Self as >::Output) -> X, X: Into<f64>Biased sampling of
amountdistinct elementsSimilar to
choose_multiple, but where the likelihood of each element's inclusion in the output may be specified. The elements are returned in an arbitrary, unspecified order.The specified function
weightmaps each itemxto a relative likelihoodweight(x). The probability of each item being selected is thereforeweight(x) / s, wheresis the sum of allweight(x).If all of the weights are equal, even if they are all zero, each element has an equal likelihood of being selected.
This implementation uses
O(length + amount)space andO(length)time if the "nightly" feature is enabled, orO(length)space andO(length + amount * log length)time otherwise.Known issues
The algorithm currently used to implement this method loses accuracy when small values are used for weights. See #1476.
Example
use *; let choices = ; let mut rng = rng; // First Draw * Second Draw = total odds // ----------------------- // (50% * 50%) + (25% * 67%) = 41.7% chance that the output is `['a', 'b']` in some order. // (50% * 50%) + (25% * 67%) = 41.7% chance that the output is `['a', 'c']` in some order. // (25% * 33%) + (25% * 33%) = 16.6% chance that the output is `['b', 'c']` in some order. println!;
Implementors
impl<T> IndexedRandom for [T]