如何在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
相关产品推荐
相关产品推荐

