如何获得从最小值到最大值(含)的随机数

Sua*_*nZi 2 rust

use rand::Rng;
fn main() {
    let mut zz = rand::thread_rng();
    let mut a: [i32; 4096] = [0; 4096];
    for n in 0..4096 {
        a[n] = zz.gen_range(-2147483648,2147483647);
    }
    ......
}
Run Code Online (Sandbox Code Playgroud)

gen_range(a,b)a可以从到获得随机数b,但不包括在内b
如果我写gen_range(-2147483648,2147483648),它就无法工作,因为gen_range -> (i32,i32)

所以我该怎么做?

was*_*mup 5

  1. 您也可以使用Uniform::from(std::i32::MIN..=std::i32::MAX)包含范围,如果重复从同一范围采样,速度会更快:
use rand::distributions::{Distribution, Uniform};
fn main() {
    let between = Uniform::from(std::i32::MIN..=std::i32::MAX);
    let mut rng = rand::thread_rng();
    let mut a = [0_i32; 4096];
    for i in 0..4096 {
        a[i] = between.sample(&mut rng);
    }
    println!("{} {}", a.iter().min().unwrap(), a.iter().max().unwrap());
}

Run Code Online (Sandbox Code Playgroud)
  1. 使用数组填充:rng.fill(&mut a);
use rand::{thread_rng, Rng};
fn main() {
    let mut rng = thread_rng();
    let mut a = [0_i32; 4096];
    rng.fill(&mut a); // array fill
    println!("{} {}", a.iter().min().unwrap(), a.iter().max().unwrap());
}
Run Code Online (Sandbox Code Playgroud)
  1. 使用a[i] = rng.gen()
use rand::{thread_rng, Rng};
fn main() {
    let mut rng = thread_rng();
    let mut a = [0_i32; 4096];
    for i in 0..4096 {
        a[i] = rng.gen();
    }
    println!("{} {}", a.iter().min().unwrap(), a.iter().max().unwrap());
}
Run Code Online (Sandbox Code Playgroud)
  1. 数组构造(len <=32):
let a: [i32; 32] = rng.gen();
Run Code Online (Sandbox Code Playgroud)
  1. 您是否一定要使用gen_range: 因为 i32 范围是 -2147483648 到 +2147483647 并 gen_range生成 [low, high) 范围内的随机值,即包含 low 且不包含 high。一种简单的解决方案是:
a[i] = rng.gen_range(-2_147_483_648_i64, 2_147_483_648_i64) as i32;
Run Code Online (Sandbox Code Playgroud)

尝试:

use rand::Rng;
fn main() {
    let mut rng = rand::thread_rng();
    let mut a = [0_i32; 4096];
    for i in 0..4096 {
        a[i] = rng.gen_range(-2_147_483_648_i64, 2_147_483_648_i64) as i32;
    }
    println!("{} {}", a.iter().min().unwrap(), a.iter().max().unwrap());
}
Run Code Online (Sandbox Code Playgroud)

此函数针对仅从给定范围中生成单个样本的情况进行了优化。另请参见均匀分布类型,如果重复从同一范围采样,该类型可能会更快。