问题 未解析的名称rand :: thread_rng


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

#![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)


7572
2018-06-09 14:47


起源

你确定你每晚都在使用吗? 这个 代码对我有用。我刚才补充道 #[feature(rand)] 并且所有内容都与您提供的完全一致 - Vladimir Matveev
@VladimirMatveev我不认为 #[bench] 方法是在围栏中编译的。 is.gd/el8M4f - Shepmaster


答案:


你可以在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还有一个内部隐藏的箱子 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));
}

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


10
2018-06-09 15:29



那么我需要用货物来建造吗?因为这只是一个小基准,我试着直接使用rustc。 - llogiq
@llogiq你总是可以手工链接到箱子,做Cargo会做的所有事情^ _ ^。我不确定无法访问内置的随机功能,但是 我的第一次尝试失败了。我发现很容易实现一次性的货运项目,所以这就是我推荐的方向。 - Shepmaster
这似乎不是错误的原因,因为作者明确指出使用夜间编译器(夜间可以自由使用外部包,尽管有功能注释)。 - Vladimir Matveev
@VladimirMatveev检查我的 试图在夜间使用箱子。功能 thread_rng 在私人模块中,而不仅仅是功能门控。此外,“外部板条箱”有点误导 - 我建议“外部板条箱”是来自crates.io,而不是与编译器秘密捆绑的那些;-)。 - Shepmaster
@Shepmaster我可以使用不同的rng吗? - llogiq