use rand::{thread_rng, Rng};
pub trait PowerShuffle {
fn power_shuffle(&mut self, power: f32);
}
impl<T> PowerShuffle for Vec<T> {
fn power_shuffle(&mut self, power: f32) {
assert!(
(0.0..=1.0).contains(&power),
"shuffle_power must be between 0 and 1"
);
let shuffle_range = (self.len() as f32 * power) as usize;
let mut rng = thread_rng();
for i in 0..self.len() {
if shuffle_range > 0 {
let upper_bound = shuffle_range.min(self.len() - i);
let swap_with = i + rng.gen_range(0..upper_bound);
self.swap(i, swap_with);
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_power_shuffle() {
let mut v = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
v.power_shuffle(0.5);
println!("{:?}", v);
}
}