scarlet_queen_replenisher/
random.rs

1use std::rc::Rc;
2
3use rand::{
4    distr::{Distribution, StandardUniform},
5    rng, Rng,
6};
7use scarlet_queen_core::{EachCrateIndividual, Individual, ReplenisherIndividualTrait};
8
9pub struct RandomReplenisherIndividual<T, const N: usize, const R: usize>
10where
11    T: Clone,
12{
13    individual: Rc<Individual<T>>,
14}
15
16impl<T, const N: usize, const R: usize> EachCrateIndividual for RandomReplenisherIndividual<T, N, R>
17where
18    T: Clone,
19{
20    type Item = T;
21
22    fn new(individual: &std::rc::Rc<scarlet_queen_core::Individual<T>>) -> Self {
23        RandomReplenisherIndividual {
24            individual: Rc::clone(individual),
25        }
26    }
27
28    fn get_individual(&self) -> &Individual<T> {
29        &self.individual
30    }
31}
32
33impl<T, const N: usize, const R: usize> ReplenisherIndividualTrait<N, R>
34    for RandomReplenisherIndividual<T, N, R>
35where
36    T: Clone,
37    StandardUniform: Distribution<T>,
38{
39    fn replenish<'a, G>(_group: G) -> Vec<T>
40    where
41        G: IntoIterator<Item = &'a Self>,
42        Self: 'a,
43    {
44        let mut rng = rng();
45
46        (0..(N - R)).map(|_| rng.random::<T>()).collect::<Vec<T>>()
47    }
48}