use genomes::Sequence;
use ops::traits::SelectOperator;
use rand::Rng;
use rand::distributions::{Range, IndependentSample};
#[derive(Clone, Copy, Serialize, Deserialize)]
pub struct Random;
impl<G, O> SelectOperator<G, O> for Random
where
G: Sequence,
O: Clone + Ord,
{
fn select<R: Rng>(
&self,
pop_with_fit: &Vec<(O, G)>,
k: usize,
rng: &mut R,
) -> Vec<G>
{
let range = Range::new(0, pop_with_fit.len());
let mut chosen = vec![];
for _ in 0..k
{
let idx = range.ind_sample(rng);
chosen.push(pop_with_fit[idx].clone().1);
}
chosen
}
}