fn sample(&mut self, it: Self::Item) -> (bool, Option<Self::Item>) {
let lucky_cap = self.lucky.capacity();
self.total += 1;
// 概率渐小的随机替换
let r = random::<usize>() % self.total + 1;
let mut replaced = None;
if r <= lucky_cap {
replaced = self.lucky[r - 1].take();
self.lucky[r - 1] = Some(it);
}
if self.total <= lucky_cap && r < self.total {
self.lucky[self.total - 1] = replaced.take();
}
(r <= lucky_cap, replaced)
}
let mut final_lucky = self.lucky.into_iter().collect::<Vec<Option<P>>>();
let mut i = self.total;
while i < lucky_cap {
i += 1;
// 概率渐小的随机替换
let r = random::<usize>() % i + 1;
if r <= lucky_cap {
final_lucky[i - 1] = final_lucky[r - 1].take();
}
}
原文作者:Rust语言中文社区;如有侵权,请联系管理员删除。