SuanZi
SuanZi

Reputation: 23

How to get a random number from min to max inclusive

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);
    }
    ......
}

gen_range(a,b) can get a random number from a to b, but not included b.
If I write gen_range(-2147483648,2147483648), it can't work, because gen_range -> (i32,i32)

So, what should I do?

Upvotes: 2

Views: 1415

Answers (1)

wasmup
wasmup

Reputation: 16233

  1. You may use Uniform::from(std::i32::MIN..=std::i32::MAX) with inclusive range too, and this is faster if sampling from the same range repeatedly:
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());
}


  1. Use array fill: 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());
}

  1. Using 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());
}

  1. Array construction (len <=32):
let a: [i32; 32] = rng.gen();

  1. Should you bound to use gen_range: since i32 range is -2147483648 to +2147483647 and gen_range generate a random value in the range [low, high), i.e. inclusive of low and exclusive of high. One simple solution is:
a[i] = rng.gen_range(-2_147_483_648_i64, 2_147_483_648_i64) as i32;

Try:

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());
}

This function is optimised for the case that only a single sample is made from the given range. See also the Uniform distribution type which may be faster if sampling from the same range repeatedly.


Upvotes: 5

Related Questions