如何在Rust 1.0中获得随机数?

Mar*_*oma 17 random rust

我试过了

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);
}
Run Code Online (Sandbox Code Playgroud)

但这给了

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};
  |                           ^^^
Run Code Online (Sandbox Code Playgroud)

我试过

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)
}
Run Code Online (Sandbox Code Playgroud)

得到了

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;
  |         ^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

She*_*ter 22

在过去,rand箱子是标准库的一部分,但很久以来被提取到箱子里.这个箱子应该是你使用的箱子:

指定Cargo.toml:

[package]
name = "stackoverflow"
version = "0.0.1"
authors = ["A. Developer <developer@example.com>"]

[dependencies]
rand = "0.7.0" # Or a newer version
Run Code Online (Sandbox Code Playgroud)

然后你的示例代码工作:

use rand::Rng; // 0.7.2

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)
}
Run Code Online (Sandbox Code Playgroud)

随着输出:

$ cargo run
     Running `target/debug/so`
i32: 1819776837, u32: 3293137459
(0.6052759716514547, '\u{69a69}')

$ cargo run
     Running `target/debug/so`
(0.23882541338214436, '\u{10deee}')
Run Code Online (Sandbox Code Playgroud)

为什么从stdlib中删除了这些有用的函数?

Rust的理念是尽可能多地放入板条箱而不是标准库.这允许每段代码以与标准库不同的速率增长和发展,并且还允许代码停止使用而不必强制它永久维护.

一个常见的例子是Python中的HTTP库序列.有多个软件包都以不同的方式做同样的事情,Python维护者必须保持所有这些软件包以提供向后兼容性.

板条箱允许避免这种特殊结果.如果箱子真的稳定了很长时间,我相信它可以重新添加到标准库中.

  • 你能解释为什么从stdlib中删除这些有用的功能吗? (3认同)