How can I generate a random number within a range in Rust?
Solution 1:
This generates a random number between 0 (inclusive) and 100 (exclusive) using Rng::gen_range
:
use rand::Rng; // 0.8.0
fn main() {
// Generate random number in the range [0, 99]
let num = rand::thread_rng().gen_range(0..100);
println!("{}", num);
}
Don't forget to add the rand
dependency to Cargo.toml:
[dependencies]
rand = "0.8"
Solution 2:
Editor's note: This answer is for a version of Rust prior to 1.0 and is not valid in Rust 1.0. See Manoel Stilpen's answer instead.
This has been changing a lot recently (sorry! it's all been me), and in Rust 0.8 it was called gen_integer_range
(note the /0.8/
rather than /master/
in the URL, if you are using 0.8 you need to be reading those docs).
A word of warning: .gen_integer_range
was entirely incorrect in many ways, the new .gen_range
doesn't have incorrectness problems.
Code for master (where .gen_range
works fine):
use std::rand::{task_rng, Rng};
fn main() {
// a number from [-40.0, 13000.0)
let num: f64 = task_rng().gen_range(-40.0, 1.3e4);
println!("{}", num);
}
Solution 3:
The documentation for Rng::gen_range
states:
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.
Uniform
can be used to generate a single value:
use rand::distributions::{Distribution, Uniform}; // 0.6.5
fn main() {
let step = Uniform::new(0, 50);
let mut rng = rand::thread_rng();
let choice = step.sample(&mut rng);
println!("{}", choice);
}
Playground
Or to generate an iterator of values:
use rand::distributions::{Distribution, Uniform}; // 0.6.5
fn main() {
let step = Uniform::new(0, 50);
let mut rng = rand::thread_rng();
let choices: Vec<_> = step.sample_iter(&mut rng).take(10).collect();
println!("{:?}", choices);
}
Playground