我正在使用Rust中的rgsl
库来包装来自C GSL数学库的函数。我使用的是随机数生成器函数,但每当我生成一个新的随机数时,我总是得到相同的精确值。我想这个数字应该在每次运行时都有所不同。有什么东西我错过了吗?我是否需要每次都设置一个新的随机种子?
extern crate rgsl;
use rgsl::Rng;
fn main() {
rgsl::RngType::env_setup();
let t = rgsl::rng::default();
let r = Rng::new(&t).unwrap()
let val = rgsl::randist::binomial::binomial(&r, 0.01f64, 1u32);
print!("{}",val);
}
我持续获得的价值是1
,考虑到获得1
的可能性0.01.
答案 0 :(得分:2)
env_setup
的文档解释了您需要知道的所有内容:
此函数读取环境变量
GSL_RNG_TYPE
和GSL_RNG_SEED
,并使用它们的值设置相应的库变量gsl_rng_default
和gsl_rng_default_seed
如果您没有为
GSL_RNG_TYPE
指定生成器,则gsl_rng_mt19937
将用作默认值。gsl_rng_default_seed
的初始值为零。
(强调我的)
与所有软件随机数生成器一样,这实际上是一种生成伪随机数的算法。算法和初始种子唯一地标识这些数字的序列。由于种子总是相同的,序列中的第一个(和第二个,第三个,......)数字将始终相同。
因此,如果我想生成一系列新的随机数,那么我每次都需要更改种子。但是,如果我使用rng生成一组随机种子,那么每次都会得到相同的种子。
那是对的。
其他语言似乎没有这种约束,这意味着如果需要可以手动设置种子,但其他方式是随机的。
这样做的一种经典方法是使用当前时间为您的RNG播种。这产生了一个可接受的"许多案件的种子。您还可以从操作系统访问 true 随机数据,并将其用作种子或将其混合以生成更多随机数据。
在Rust中没有办法做到这一点吗?
这是一个非常不同的问题。如果只是想在Rust中使用随机数生成器,请使用rand crate。这使用了我上面描述的技术。
你甚至可以做一些疯狂的事情,比如使用rand crate中的随机值为你的另一个随机数生成器播种。我只是假设你使用那个箱子而不是兰德有一些重要的原因。