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

如何在rand 0.8.5中生成排除0的[-max, max)区间i32随机数?

生成排除0的[-max, max)区间随机数(rand 0.8.5)

这里有几种惯用的实现方式,可根据场景选择:

方式一:先取绝对值再随机符号(推荐,无重试开销)

先生成1到max的正整数,再随机赋予正负号,直接避开0:

use rand::Rng;

fn main() {
    let max = 100_i32;
    let mut rng = rand::thread_rng();
    let abs_val = rng.gen_range(1..=max);
    let sign = if rng.gen_bool(0.5) { 1 } else { -1 };
    let result = abs_val * sign;
}

方式二:循环重试直到得到非0值(逻辑最简单)

直接生成原区间的数,若为0则重新生成,直到拿到非0结果:

use rand::Rng;

fn main() {
    let max = 100_i32;
    let mut rng = rand::thread_rng();
    let result = loop {
        let num = rng.gen_range(-max..max);
        if num != 0 {
            break num;
        }
    };
}

注:除非max=1(此时只有±1两种可能),否则重试概率极低,实际使用中几乎不会有性能问题。

方式三:区间映射转换(无重试,适合严格单次采样场景)

将原区间转换为不含0的连续范围,再映射回目标区间:

use rand::distributions::{Distribution, Uniform};

fn main() {
    let max = 100_i32;
    let mut rng = rand::thread_rng();
    // 生成1到2*max-1的整数,对应原区间的非0值
    let uniform = Uniform::from(1..=2*max - 1);
    let num = uniform.sample(&mut rng);
    // 映射:1~max → 1~max;max+1~2max-1 → -(max-1)~-1
    let result = if num <= max { num } else { num - 2 * max };
}

内容的提问来源于stack exchange,提问作者Mohamad-Jaafar NEHME

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 07:15:41