未解析的名称rand :: thread_rng

时间:2015-06-09 14:47:57

标签: 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; })
}

然而,rustc回来了:

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

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

1 个答案:

答案 0 :(得分:10)

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

extern crate rand;

fn main() {
    rand::thread_rng();
}

出现同样的错误:

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

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

[dependencies]
rand = "*"

这是因为Rust has an internal, hidden crate also called rand。当1.0稳定性保证即将来临时,许多这些主要是内部的板条箱被分拆到their own reposhosted on crates.io。但是,编译器仍然需要这些包的部分,因此它们的存根保留在编译器中,但标记为私有。

  

我可以使用不同的rng吗?

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

#![feature(rand)]

extern crate rand;

use rand::Rng;

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

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