Random Rust GSL库始终为随机数生成器返回相同的数字
我使用的是Rust中的Random Rust GSL库始终为随机数生成器返回相同的数字,random,rust,Random,Rust,我使用的是Rust中的rgsl库,它包装了C GSL数学库中的函数。我使用了一个随机数生成器函数,但是每当我生成一个新的随机数时,我总是得到相同的精确值。我认为每次运行函数时,该数字都会有所不同。有什么我遗漏的吗?我是否每次都需要设置一个新的随机种子 extern crate rgsl; use rgsl::Rng; fn main() { rgsl::RngType::env_setup(); let t = rgsl::rng::default(); let r
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,这个值似乎非常高。
的文档解释了您需要知道的一切:
此函数读取环境变量GSL\u RNG\u TYPE
和GSL\u RNG\u SEED
,并使用它们的值设置相应的库变量GSL\u RNG\u default
和GSL\u RNG\u default\u SEED
如果未为GSL\u RNG\u类型指定生成器
,则将GSL\u RNG\u mt19937
用作默认值gsl\u rng\u default\u seed的初始值为零。
(强调矿山)
像所有的软件随机数生成器一样,这是一个生成伪随机数的算法。算法和初始种子唯一地标识这些数字的序列。因为种子总是相同的,所以序列中的第一个(以及第二个、第三个……)数字总是相同的
因此,如果我想生成一系列新的随机数,那么每次我都需要更改种子。但是,如果我使用rng生成一组随机种子,那么每次都会得到相同的种子
没错
其他语言似乎没有这种约束,这意味着种子可以根据需要手动设置,但在其他方面是随机的
实现这一点的经典方法是使用当前时间为RNG播种。在许多情况下,这会产生“可接受”的种子。您还可以从操作系统访问真正的随机数据,并将其用作种子或将其混合以生成更多的随机数据
在锈迹斑斑的地方没有办法做到这一点吗
这是一个非常不同的问题。如果您只想让随机数生成器生锈,请使用。这使用了我上面描述的技术
你甚至可以做一些疯狂的事情,比如使用rand板条箱中的随机值为你的另一个随机数生成器播种。我只是假设你使用那个板条箱而不是兰德是有重要原因的。谢谢你的提示。我猜是用了同一粒种子。所以我更仔细地看了一下文档,有一点让人困惑。因此,如果我想生成一系列新的随机数,那么每次我都需要更改种子。但是,如果我使用rng生成一组随机种子,那么每次都会得到相同的种子。所以我永远无法真正摆脱伪随机发生器的确定性。其他语言似乎没有这种约束,这意味着种子可以根据需要手动设置,但在其他方面是随机的。在锈迹斑斑的情况下没有办法做到这一点吗?哦,谢谢@Shepmaster。是的,我必须使用rgsl板条箱,因为它有一个生成二项式随机变量的函数。这确实很有帮助。我现在明白了。