Как я могу сгенерировать случайное число в диапазоне в 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. Добавьте смещение, если вам нужен другой диапазон.

Другие вопросы по тегам