简体   繁体   English

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

[英]How can I get a random number in Rust 1.0?

I tried我试过

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

but this gives但这给

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

and I tried我试过

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

and got并得到

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;
  |         ^^^^^^^^^

In the far past, the rand crate was part of the standard library but has long since been extracted to a crate .在很久以前, rand crate 是标准库的一部分,但早已被提取到 crate 中 This crate should be the one you use:这个箱子应该是你使用的那个:

Specify a Cargo.toml :指定Cargo.toml

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

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

Then your example code works:然后您的示例代码有效:

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

With the output:随着输出:

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

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

Why were these useful functions removed from stdlib?为什么从 stdlib 中删除了这些有用的函数?

Rust has a philosophy of placing as much as possible into crates instead of the standard library. Rust 的理念是将尽可能多的内容放入 crate 而不是标准库。 This allows each piece of code to grow and evolve at a different rate than the standard library and also allows the code to stop being used without forcing it to be maintained forever.这允许每段代码以与标准库不同的速度增长和发展,并且还允许代码停止使用而不会强制永远维护它。

A common example is the sequence of HTTP libraries in Python .一个常见的例子是Python 中的 HTTP 库序列 There are multiple packages that all do the same thing in different ways and the Python maintainers have to keep all of them to provide backwards compatibility.有多个包都以不同的方式做同样的事情,Python 维护者必须保留所有包以提供向后兼容性。

Crates allow this particular outcome to be avoided.板条箱可以避免这种特殊的结果。 If a crate truly stabilizes for a long time, I'm sure it could be re-added to the standard library.如果一个 crate 真的稳定了很长时间,我相信它可以重新添加到标准库中。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM