You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 04:11:03