6

我可以看到我必须像这样导入:

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

但是 rust 文档清楚地说有一个功能next_u32http://doc.rust-lang.org/std/rand/struct.OsRng.html

我错过了什么?

4

3 回答 3

4

你的问题是它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);
}
于 2014-12-08T17:17:54.213 回答
1

仅供参考: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)
}
于 2019-10-12T09:53:38.620 回答
1

在 Rust 上生成安全随机数的搜索返回了这个 SO question,但作为对当前答案状态的评论,Rust 不再在标准库中包含随机数生成。这是一个更新的示例(截至 2017 年 1 月):

货运.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#cryptographic-security


否则,使用原始答案中的代码会出现此错误:

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
于 2017-01-13T01:00:07.203 回答