Генерация безопасных случайных чисел в Rust

Я вижу, что я должен импортировать, как это:

use std::io::IoResult;
use std::num::{Int, ToPrimitive};
use std::rand::{OsRng, Rng};

Затем создайте новый экземпляр OsRng и попробуйте сгенерировать новый u32 int из него

fn main() {

  let mut rng = OsRng::new();

  let num:u32 = rng.next_u32();
  println!("{}",num);
}

Однако я получаю тип ошибки core::result::Result<std::rand::os::imp::OsRng, std::io::IoError> не реализует какой-либо метод в области с именем next_u32

Но документация ржавчины ясно говорит, что есть функция next_u32? http://doc.rust-lang.org/std/rand/struct.OsRng.html

Что мне не хватает?

2 ответа

Решение

Ваша проблема здесь в том, что OsRng::new() не возвращает OsRng экземпляр, но IoResult<OsRng>, Потому что программа не может получить генератор случайных чисел ОС.

Пример использования будет:

use std::rand::{OsRng, Rng};

fn main() {

    let mut rng = match OsRng::new() {
        Ok(g) => g,
        Err(e) => panic!("Failed to obtain OS RNG: {}", e)
    };

    let num:u32 = rng.next_u32();
    println!("{}",num);
}

К вашему сведению: API изменился в последней версии, см. https://rust-random.github.io/book/update-0.7.html

TL; версия DR, используйте https://github.com/rust-random/getrandom

fn get_random_buf() -> Result<[u8; 32], getrandom::Error> {
    let mut buf = [0u8; 32];
    getrandom::getrandom(&mut buf)?;
    Ok(buf)
}

Поиск для генерации безопасных случайных чисел в Rust возвратил этот вопрос SO, но в качестве комментария к текущему состоянию ответа Rust больше не включает генерацию случайных чисел в стандартной библиотеке. Вот обновленный пример (по состоянию на январь 2017 года):

Cargo.toml

[dependencies]
rand = "0.3.0"

main.rs

extern crate rand;
use rand::{OsRng, Rng};

fn main() {
    let mut rng = OsRng::new().expect("Error opening random number generator");
    println!("Random: {}", rng.next_u32());
}

Полезная ссылка: https://doc.rust-lang.org/rand/rand/index.html


В противном случае использование кода из исходного ответа дает эту ошибку:

error[E0432]: unresolved import `std::rand::Rng`
 --> src/main.rs:5:24
  |
5 | use std::rand::{OsRng, Rng};
  |                        ^^^ no `Rng` in `std::rand`

error: module `rand` is private
 --> src/main.rs:5:17
  |
5 | use std::rand::{OsRng, Rng};
  |                 ^^^^^

error: module `rand` is private
 --> src/main.rs:5:24
  |
5 | use std::rand::{OsRng, Rng};
  |                        ^^^

error: aborting due to 3 previous errors
Другие вопросы по тегам