未解析的名称rand :: thread_rng

llo*_*giq 12 rust

我想用一些随机数作为基准:

#![feature(test)]

/// benchmarks for different map implementation
extern crate test;
extern crate rand;

use test::Bencher;
use rand::Rng;

#[bench]
fn setup_random_hashmap(b: &mut Bencher) {
    let mut val : u32 = 0;
    let mut rng = rand::thread_rng();
    let mut map = std::collections::HashMap::new();

    b.iter(|| { map.insert(rng.gen::<u32>(), val); val += 1; })
}
Run Code Online (Sandbox Code Playgroud)

但是,rustc回来了:

bench.rs:14:16: 14:32 error: unresolved name `rand::thread_rng`
bench.rs:14     let mut rng = rand::thread_rng();
Run Code Online (Sandbox Code Playgroud)

thread_rng定义rand为a pub fn.我错过了什么声明?我在用1.2.0-nightly (8f9f2fe97 2015-06-07).

She*_*ter 11

你可以在Rust 1.0中重现这个(至少从1.13开始):

extern crate rand;

fn main() {
    rand::thread_rng();
}
Run Code Online (Sandbox Code Playgroud)

出现同样的错误:

error[E0425]: unresolved name `rand::thread_rng`
 --> <anon>:4:5
  |
4 |     rand::thread_rng();
  |     ^^^^^^^^^^^^^^^^ unresolved name
Run Code Online (Sandbox Code Playgroud)

要解决此问题,您需要将包添加rand到Cargo.toml:

[dependencies]
rand = "*"
Run Code Online (Sandbox Code Playgroud)

这是因为Rust有一个内部隐藏的箱子也被称为rand.当1.0稳定性保证即将来临时,许多这些大多数内部板条箱都被分拆出来并自行回收托管在crates.io上.但是,编译器仍然需要这些包的部分,因此它们的存根保留在编译器中,但标记为私有.

我可以使用不同的rng吗?

一个聪明的想法似乎工作!对于未来的人来说,这适用于夜间构建,这意味着您接受可能发生的任何破坏代码!

#![feature(rand)]

extern crate rand;

use rand::Rng;

fn main() {
    let mut rng = rand::IsaacRng::new_unseeded();
    println!("{}", rng.gen_range(0, 10));
}
Run Code Online (Sandbox Code Playgroud)

最大的缺点是程序的每次运行都会有相同的数字序列,因为它总是会有相同的种子.这可能是基准测试的好处!