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

Rust中生成无重复随机数的最惯用实现方式

在Rust中生成不重复随机数的惯用实现方案

根据需求场景不同,有两种最符合Rust编程风格的实现方式:

场景1:生成指定范围内的完整无重复随机序列

如果需要的是某个连续区间内所有数字的随机排列(比如1到10的无重复随机序列),直接创建包含所有数字的向量,再用rand库的shuffle方法打乱是最高效且符合惯用风格的做法——这本质是Fisher-Yates洗牌算法,rand库已经封装了最优实现。

首先在Cargo.toml中添加依赖:

[dependencies]
rand = "0.8"

实现代码:

use rand::seq::SliceRandom;
use rand::thread_rng;

fn main() {
    // 生成1到10的无重复随机序列
    let mut numbers: Vec<i32> = (1..=10).collect();
    let mut rng = thread_rng();
    numbers.shuffle(&mut rng);

    println!("无重复随机序列: {:?}", numbers);
}

这种方法的时间复杂度为O(n),空间复杂度O(n),是处理这类需求的首选方案。

场景2:逐个生成不重复随机数(大范围采样)

如果目标范围很大(比如从1到10000中选100个不重复数),创建全量向量不现实,此时可以用HashSet记录已生成的数字,循环生成直到得到未出现过的结果。

实现代码:

use rand::Rng;
use rand::thread_rng;
use std::collections::HashSet;

// 生成count个[min, max]范围内的不重复随机数
fn generate_unique_randoms(count: usize, min: i32, max: i32) -> Vec<i32> {
    let mut rng = thread_rng();
    let mut seen = HashSet::new();
    // 预分配容量避免多次扩容
    let mut result = Vec::with_capacity(count);

    while result.len() < count {
        let num = rng.gen_range(min..=max);
        // HashSet::insert返回true表示数字未存在,可加入结果
        if seen.insert(num) {
            result.push(num);
        }
    }

    result
}

fn main() {
    let unique_nums = generate_unique_randoms(5, 1, 20);
    println!("无重复随机数: {:?}", unique_nums);
}

注意:如果要生成的数量接近范围总长度,碰撞概率会大幅升高,此时还是推荐场景1的洗牌方案更高效。

内容的提问来源于stack exchange,提问作者mnk802

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:20:21