Rust中有放回抽样:是否存在更符合惯用风格的实现方式
Rust有放回抽样的惯用实现方式
原代码功能正常,但可以借助Rust的迭代器特性和rand库的API,写出更符合惯用风格的实现。以下是优化后的代码:
use rand::seq::IteratorRandom; use rand::thread_rng; fn main() { let mut rng = thread_rng(); let values = vec![1, 2, 3, 4, 5]; // 通过迭代器链生成10个随机样本并收集到Vec中 let samples: Vec<_> = std::iter::repeat_with(|| values.iter().choose(&mut rng).unwrap()) .take(10) .collect(); println!("{:?}", samples); }
关键优化点:
- 移除多余的
as Vec<i32>转换,vec!宏会自动推导正确的类型。 - 用
std::iter::repeat_with替代手动for循环+push操作,通过迭代器链的方式生成样本并收集,契合Rust"优先使用迭代器"的惯用写法。 - 改用
thread_rng()获取线程本地随机数生成器,这是rand库中更常用的方式(原rand::rng()是thread_rng()的别名,显式写出更清晰)。
如果需要抽取元素的所有权而非引用,只需调整获取元素的方式:
// 抽取元素所有权的版本 let samples: Vec<i32> = std::iter::repeat_with(|| values.choose(&mut rng).unwrap().clone()) .take(10) .collect();
内容的提问来源于stack exchange,提问作者Roger V.
相关产品推荐
相关产品推荐

