在Rust中生成安全随机数

les*_*how 3 random rust rust-obsolete

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

use std::io::IoResult;
use std::num::{Int, ToPrimitive};
use std::rand::{OsRng, Rng};
Run Code Online (Sandbox Code Playgroud)

然后创建一个新的OsRng实例,并尝试从中生成一个新的u32 int

fn main() {

  let mut rng = OsRng::new();

  let num:u32 = rng.next_u32();
  println!("{}",num);
}
Run Code Online (Sandbox Code Playgroud)

但是我得到的错误类型core::result::Result<std::rand::os::imp::OsRng, std::io::IoError>没有实现命名范围内的任何方法next_u32

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

我错过了什么?

Lev*_*ans 5

这里你的问题是OsRng::new()不返回OsRng实例,而是返回实例IoResult<OsRng>.因为程序无法获取OS随机数生成器.

示例用法是:

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);
}
Run Code Online (Sandbox Code Playgroud)

  • try!(OsRng::new()) 与 match 语句相似吗?**也许不是我刚试过。并出现错误。有什么理由不能只导入 use std::rand:OsRng 而不是 {OsRng, Rng} 吗? (2认同)
  • 对于现代Rust,使用`rand :: {OsRng,Rng}`和`rand` crate. (2认同)