我可以看到我必须像这样导入:
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
我错过了什么?
答案 0 :(得分: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);
}
答案 1 :(得分:1)
在Rust上搜索生成安全随机数返回了这个问题,但作为对当前答案状态的评论,Rust不再包括标准库中的随机数生成。这是一个更新的示例(截至2017年1月):
[dependencies]
rand = "0.3.0"
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
答案 2 :(得分:0)
仅供参考: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)
}