Random Rust GSL库始终为随机数生成器返回相同的数字

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

我使用的是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,这个值似乎非常高。

的文档解释了您需要知道的一切:

此函数读取环境变量
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板条箱,因为它有一个生成二项式随机变量的函数。这确实很有帮助。我现在明白了。