2015-10-05 192 views
1

我正在Rust中使用rgsl库,该库包装C GSL数学库中的函数。我使用的是随机数生成器函数,但每当我生成一个新的随机数时,我总是得到相同的确切值。我想这个数字应该在函数的每次运行中都会有所不同。有什么我失踪了吗?每次都需要设置一个新的随机种子吗?Rust 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.

回答

2

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

这函数读取环境变量GSL_RNG_TYPEGSL_RNG_SEED并使用它们的值来设置相应的库变量gsl_rng_defaultgsl_rng_default_seed

如果您没有为GSL_RNG_TYPE指定发生器,那么将使用gsl_rng_mt19937作为默认值。 gsl_rng_default_seed的初始值为零。

(重点煤矿)

像所有的软件随机数生成器,这是真的产生随机数的算法。该算法和初始种子唯一地识别这些数字的序列。由于种子总是相同的,序列中的第一个(和第二个,第三个......)数字将始终相同。

所以如果我想要生成一系列新的随机数,那么我需要每次更改种子。但是,如果我使用rng生成一组随机种子,那么每次都会得到相同的种子。

这是正确的。

其他语言似乎没有这个约束,这意味着种子可以手动设置,如果需要的话,但是否则是随机的。

一个经典的方法是使用当前时间播种您的RNG。这在许多情况下产生“可接受的”种子。您还可以访问操作系统中的随机数据,并将其用作种子或将其混合以生成更多随机数据。

Rust中没有办法做到这一点吗?

这是一个非常不同的问题。如果你只是想要一个随机数发生器在Rust,使用rand crate。这使用了像我上面描述的技术。

你甚至可以做一些疯狂的事情,比如使用rand包中的随机值来播种你的其他随机数生成器。我只是假设你有一些重要的原因,你使用的是箱子而不是兰德。

+0

谢谢你的注意。我想它是使用相同的种子。所以我仔细看了一下文档,有一件事情让人困惑。因此,如果我想生成一系列新的随机数,那么我需要每次更改种子。但是,如果我使用rng生成一组随机种子,那么每次都会得到相同的种子。所以我永远无法摆脱伪随机生成器的确定性一面。其他语言似乎没有这个限制,这意味着种子可以根据需要手动设置,但是否则是随机的。 Rust中没有办法做到这一点吗? – krishnab

+0

哦,谢谢@Shepmaster。是的,我必须使用rgsl箱子,因为它具有生成二项式随机变量的功能。不过这真的很有帮助。我现在知道这是如何工作的。 – krishnab

相关问题