不一次性将数据读入内存,只遍历一次数据即可等概率抽取子集数据,真是神奇。
测试例子:
0到99一百个数字中随机抽取10个数,每个数被抽到概率1/10;重复1000次抽样,结果统计每个数字被抽到的次数为 1000 * 1/10 = 100 次左右。
use rand::Rng;
use std::collections::BTreeMap;
use rand::prelude::*;
use rand_pcg::Pcg64;
fn main() {
let mut total = Vec::new(); // 总数据集
for x in 0..100 { total.push(x); }
let mut rng = Pcg64::seed_from_u64(11); // 随机种子
let n = 10; // 取10个数
let mut bt = BTreeMap::new();
/// 1000次抽样测试
for _ in 0..1000 {
let mut get = vec![];
for i in 0..n { get.push(i as i32); }
for t in n..total.len() {
let ret:usize = rng.gen_range(0..=t);
if ret < n {
get[ret] = total[t];
}
}
// 结果统计
for x in get.iter() {
*bt.entry(*x).or_insert(0) += 1;
}
}
for (k,v) in bt {
println!("{}->{}",k,v);
}
}
结果:
计数结果每个数字次数基本都在100次左右。
标签:10,抽样,..,mut,蓄水池,use,算法,let,total From: https://www.cnblogs.com/mmtinfo/p/16855785.html