Неразрешенное имя 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).

Ответ 1

Вы можете воспроизвести это в 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));
}

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