Подтвердить что ты не робот

Как я могу получить случайное число в Rust 1.0?

Я пробовал

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

но это дает

error[E0432]: unresolved import `std::rand::task_rng`
 --> rand.rs:1:17
  |
1 | use std::rand::{task_rng, Rng};
  |                 ^^^^^^^^ no `task_rng` in `rand`

error[E0432]: unresolved import `std::rand::Rng`
 --> rand.rs:1:27
  |
1 | use std::rand::{task_rng, Rng};
  |                           ^^^ no `Rng` in `rand`

error[E0603]: module `rand` is private
 --> rand.rs:1:17
  |
1 | use std::rand::{task_rng, Rng};
  |                 ^^^^^^^^

error[E0603]: module `rand` is private
 --> rand.rs:1:27
  |
1 | use std::rand::{task_rng, Rng};
  |                           ^^^

и я попробовал

extern crate rand;
use rand::Rng;

fn main() {
    let mut rng = rand::thread_rng();
    if rng.gen() {
        // random bool
        println!("i32: {}, u32: {}", rng.gen::<i32>(), rng.gen::<u32>())
    }
    let tuple = rand::random::<(f64, char)>();
    println!("{:?}", tuple)
}

и получил

error[E0425]: cannot find function `thread_rng` in module `rand`
 --> rand.rs:5:29
  |
5 |         let mut rng = rand::thread_rng();
  |                             ^^^^^^^^^^ not found in `rand`
  |
help: possible candidate is found in another module, you can import it into scope
  |     use std::__rand::thread_rng;

error[E0425]: cannot find function `random` in module `rand`
  --> rand.rs:10:27
   |
10 |         let tuple = rand::random::<(f64, char)>();
   |                           ^^^^^^ not found in `rand`

error: use of unstable library feature 'rand': use `rand` from crates.io (see issue #27703)
 --> rand.rs:1:5
  |
1 |     extern crate rand;
  |     ^^^^^^^^^^^^^^^^^^

error: use of unstable library feature 'rand': use `rand` from crates.io (see issue #27703)
 --> rand.rs:2:9
  |
2 |     use rand::Rng;
  |         ^^^^^^^^^
4b9b3361

Ответ 1

В далеком прошлом ящик rand был частью стандартной библиотеки, но уже давно был извлечен в ящик. Этот ящик должен быть тем, который вы используете:

Укажите Cargo.toml:

[package]
name = "stackoverflow"
version = "0.0.1"
authors = ["A. Developer <[email protected]>"]

[dependencies]
rand = "0.3.15" # Or a newer version

Тогда ваш пример кода работает:

extern crate rand;

use rand::Rng;

fn main() {
    let mut rng = rand::thread_rng();
    if rng.gen() { // random bool
        println!("i32: {}, u32: {}", rng.gen::<i32>(), rng.gen::<u32>())
    }
    let tuple = rand::random::<(f64, char)>();
    println!("{:?}", tuple)
}

С выходом:

$ cargo run
     Running `target/debug/so`
(0.310133, '\u{cd8fb}')

$ cargo run
     Running `target/debug/so`
i32: 1568599182, u32: 2222135793
(0.906881, '\u{9edc}')

Почему эти полезные функции были удалены из stdlib?

У Rust есть философия размещения как можно больше в ящиках вместо стандартной библиотеки. Это позволяет каждой части кода расти и развиваться с другой скоростью, чем стандартная библиотека, а также позволяет использовать код, не заставляя его поддерживать навсегда.

Общим примером является последовательность HTTP-библиотек в Python. Есть несколько пакетов, которые все делают одинаково по-разному, а поддерживающие Python должны поддерживать все, чтобы обеспечить обратную совместимость.

Ящики позволяют избежать этого конкретного результата. Если ящик действительно стабилизируется в течение длительного времени, я уверен, что его можно было бы добавить в стандартную библиотеку.