Unfortunately, the method is defined for shuffling fragments. Due to its own complexity constraints, a cannot store its elements in a slice, so it can never be directly called on . rand::Rng::shuffleVecDequeshuffleVecDeque
values shuffle , O (1) , VecDeque . , , , values , .
:
" " rand::Rng::shuffle :
extern crate rand;
use std::collections::VecDeque;
trait LenAndSwap {
fn len(&self) -> usize;
fn swap(&mut self, i: usize, j: usize);
}
fn shuffle<T, R>(values: &mut T, mut rng: R)
where T: LenAndSwap,
R: rand::Rng {
let mut i = values.len();
while i >= 2 {
i -= 1;
values.swap(i, rng.gen_range(0, i + 1));
}
}
impl<T> LenAndSwap for VecDeque<T> {
fn len(&self) -> usize {
self.len()
}
fn swap(&mut self, i: usize, j: usize) {
self.swap(i, j)
}
}
fn main() {
let mut v: VecDeque<u64> = [1, 2, 3, 4].iter().cloned().collect();
shuffle(&mut v, rand::thread_rng());
println!("{:?}", v);
}