use crate::traits::ChromosomeT;
use rand::Rng;
pub fn random<U: ChromosomeT>(chromosomes: &[U], num_parents: usize) -> Vec<Vec<usize>> {
let num_parents = num_parents.max(2);
let n = chromosomes.len();
let group_count = n / num_parents;
let mut mating = Vec::with_capacity(group_count);
let mut indexes: Vec<usize> = (0..n).collect();
let mut rng = crate::rng::make_rng();
let mut remaining = n;
crate::log_debug!(target="selection_events", method="random"; "Starting random selection");
while remaining >= num_parents {
let mut group = Vec::with_capacity(num_parents);
for _ in 0..num_parents {
let r = rng.random_range(0..remaining);
let index_value = indexes[r];
remaining -= 1;
indexes.swap(r, remaining);
group.push(index_value);
}
crate::log_trace!(target="selection_events", method="random"; "Mating group: {:?}", group);
mating.push(group);
}
mating
}