Как я могу сгенерировать случайное число в диапазоне в Rust?
В поисках того, как сгенерировать случайное число с помощью Rust, я наткнулся на следующий пример. Однако, похоже, что это не работает... пример не показывает, к какой версии Rust он относится, поэтому, возможно, он устарел, или, возможно, я что-то не так понял.
// http://static.rust-lang.org/doc/master/std/rand/trait.Rng.html
01 use std::rand;
02 use std::rand::Rng;
03
04 fn main() {
05 let mut rng = rand::task_rng();
06 let n: uint = rng.gen_range(0u, 10);
07 println!("{}", n);
08 let m: float = rng.gen_range(-40.0, 1.3e5);
09 println!("{}", m);
10 }
Когда я пытаюсь скомпилировать это, следующие результаты:
test_rand002.rs:6:17: 6:39 error: type `@mut std::rand::IsaacRng` does not
implement any method in scope named `gen_range`
test_rand002.rs:6 let n: uint = rng.gen_range(0u, 10);
^~~~~~~~~~~~~~~~~~~~~~
test_rand002.rs:8:18: 8:46 error: type `@mut std::rand::IsaacRng` does not
implement any method in scope named `gen_range`
test_rand002.rs:8 let m: float = rng.gen_range(-40.0, 1.3e5);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
error: aborting due to 2 previous errors
Есть другой пример (как показано ниже) на той же странице (выше), который работает. Тем не менее, это не совсем то, что я хочу, хотя я мог бы адаптировать его.
другой пример (который работает):
use std::rand;
use std::rand::Rng;
fn main() {
let mut rng = rand::task_rng();
let x: uint = rng.gen();
println!("{}", x);
println!("{:?}", rng.gen::<(f64, bool)>());
}
Как я могу сгенерировать "простое" случайное число, используя Rust (например, i64) в заданном диапазоне (например, от 0 до n)?
4 ответа
Это сильно изменилось в последнее время (извините! Это все я), а в 0.8 это называлось gen_integer_range
(Обратите внимание /0.8/
скорее, чем /master/
в URL, если вы используете 0.8, вы должны читать эти документы).
Слово предупреждения: .gen_integer_range
был совершенно неверным во многих отношениях, новый .gen_range
не имеет проблем с некорректностью
Код для мастера (где .gen_range
работает отлично):
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);
}
У меня получилось так:
extern crate rand;
use rand::Rng;
fn main(){
// Generate random number in the range [0, 99]
let num = rand::thread_rng().gen_range(0, 100);
println!("{}", num);
}
Он генерирует случайное число от 0 до 100.
Не забудьте добавить зависимости rand в cargo.toml
Изменить: случайное число генерируется в пределах интервала [0,99]
Теперь ржавчина стабильна, случайное число может быть сгенерировано следующим образом: (Работает с crate: rand=0.3 и rand=0.4)
extern crate rand;
use rand::distributions::{IndependentSample, Range};
fn main() {
let step = Range::new(0, 50);
let mut rng = rand::thread_rng();
let choice = step.ind_sample(&mut rng);
println!("{}", choice);
}
Живой пример и ссылка на Документы
А почему бы вам просто не использовать модуль?
let x = rng.gen<u32>() % 25
поэтому ваши значения будут между 0 и 24. Добавьте смещение, если вам нужен другой диапазон.