如果我用这种方法生成10个随机数,它是有效的(会产生不同的值)。
但是如果我将它们因子化为一个结构体,生成的值总是相同的:
这两种使用
fn main() {
let seed = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.expect("system time cannot be before unix epoch")
.as_millis() as u64;
let mut rng = oorandom::Rand32::new(seed);
for _ in 0..10 {
println!("Your random number is: {}", &rng.rand_range(0..4));
}
但是如果我将它们因子化为一个结构体,生成的值总是相同的:
use oorandom::{self, Rand32};
struct Util {
rng: Rand32,
}
impl Util {
pub fn new() -> Self {
let seed = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_millis() as u64;
println!("new color util {}", seed);
let rng = Rand32::new(seed);
Util { rng }
}
pub fn get_random(&self) -> u32 {
let mut rng = self.rng;
let random_number = rng.rand_range(0..4);
random_number
}
}
fn main() {
let util = Util::new();
for _ in 0..10 {
println!("Your random number is: {}", util.get_random());
}
}
这两种使用
get_random
API的方式有什么区别,为什么当我将rng
放入一个结构体中时会出错?
#[derive(Copy)]
的粉丝的原因... - FinomnisCopy
不是自动特质,那正是因为存在这样的情况,实现它是没有意义的。 - jthulhuoorandom
没有适当的贡献方式(没有 GitHub),它有未解决的错误报告(https://todo.sr.ht/~icefox/oorandom/7),甚至没有实现rand_core
(https://docs.rs/rand_core/)。@Magin 我认为通常应该用rand_pcg
替代它。我不明白为什么oorandom
变得这么大,但在我看来,它并不值得如此。也许是因为它有一个漂亮的主页。 - Finomnisoorandom
的信息。我会在我的项目中尝试使用rand_pcg
! - Maginrand_core
特性来保持一致性,这意味着一些功能需要RandCore
或SeedableRng
特性。但是,你可以使用例如Pcg32::seed_from_u64
来初始化它,并使用所有的RandCore
函数来获取随机性。 - Finomnis