scarlet_queen_replenisher/
random.rs1use 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}