# Rust Random Choice

This is an implementation of the stochastic universal sampling algorithm: https://en.wikipedia.org/wiki/Stochastic_universal_sampling

• Blazingly fast: O(n) (Roulette wheel selection algorithm: O(n * log n))
• Low Memory Usage: O(n); in place variant: O(1)
• There is a good diversity for the case, that all weights are equally distributed (in contrast to the roulette wheel selection algorithm which tends to select the same sample n times)
• The sum of the weights don't have to be 1.0, but must not overflow

## Applications

• Evolutionary algorithms: Choose the n fittest populations by their fitness fi
• Monte Carlo Localization: Resampling of n particles by their weight w

# Examples

## Default Way

```extern crate random_choice;
use self::random_choice::random_choice;

let mut samples = vec!["hi", "this", "is", "a", "test!"];
let weights: Vec<f64> = vec![5.6, 7.8, 9.7, 1.1, 2.0];

let number_choices = 100;
let choices = random_choice().random_choice_f64(&samples, &weights, number_choices);

for choice in choices {
print!("{}, ", choice);
}```

## With Custom Seed

```extern crate rand;
extern crate random_choice;
use random_choice::RandomChoice;
use rand::SeedableRng;

fn main() {
let mut samples = vec!["hi", "this", "is", "a", "test!"];
let weights: Vec<f64> = vec![5.6, 7.8, 9.7, 1.1, 2.0];

let rng = rand::StdRng::from_seed(&[5000, 44, 55, 199]);

let mut random_choice = RandomChoice::new(rng);
let number_choices = 100;
let choices = random_choice.random_choice_f64(&mut samples, &weights, number_choices);

for choice in choices {
print!("{}, ", choice);
}
}```

## Functions

 random_choice Creates a new RandomChoice struct using the ThreadRng