2015-06-09 3 views
11

Я хотел использовать несколько случайных чисел для ориентира:нерешенным имя рэнд :: 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).

+0

Вы уверены, что используете ночную жизнь? [This] (http://is.gd/S7X1yu) работает для меня. Я только что добавил '# [feature (rand)]' и все скомпилировано точно так же, как вы предоставили. –

+1

@ VladimirMatveev Я не думаю, что '' [bench] 'методы скомпилированы в манере. http://is.gd/el8M4f – Shepmaster

ответ

9

Вы можете воспроизвести это в 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 repos и hosted on crates.io. Однако компилятор все еще нуждался в частях этих ящиков, и поэтому их заглушки остались в компиляторе, но были закрыты.

could I just use a different rng then?

Умная идея, которая срабатывает! Для будущих людей это только применяется к ночным сборкам, и это означает, что вы принимаете любой код, который может произойти!

#![feature(rand)] 

extern crate rand; 

use rand::Rng; 

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

Самым большим недостатком является то, что каждый запуск программы будет иметь ту же последовательность чисел, потому что она всегда будет иметь тот же семя. Это может быть полезно для бенчмаркинга!

+1

Должен ли я использовать груз для сборки? Поскольку это был всего лишь небольшой ориентир, я попытался использовать rustc напрямую. – llogiq

+0

@llogiq Вы всегда можете связаться с ящиком вручную, делая все, что Cargo будет делать^_ ^. Я не знаю точно, что нет возможности получить доступ к встроенным случайным функциям, но [моя первая попытка не удалась] (http://is.gd/NJdvBt). Я нашел довольно легко разворачивать одноразовые проекты Cargo, так что это направление, которое я бы рекомендовал. – Shepmaster

+0

Это, по-видимому, не является причиной ошибки, потому что автор явно указал, что используется ночной компилятор (и ночные часы могут свободно использовать внешние ящики, хотя и с аннотацией функций). –

Смежные вопросы