2015-03-29 2 views
13

Я попыталсяКак я могу получить случайное число в 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; 
    |   ^^^^^^^^^ 
+0

Обратите внимание, что это вопрос для начинающих. Это (после «Hello World»), второе, что я пробовал. –

ответ

19

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

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

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

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

+2

Не могли бы вы объяснить, почему эти полезные функции удалены из stdlib? –

Смежные вопросы