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

时间:2015-10-05 00:11:58

标签: 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 = Rng::new(&t).unwrap()

    let val = rgsl::randist::binomial::binomial(&r, 0.01f64, 1u32);
    print!("{}",val);
}

我持续获得的价值是1,考虑到获得1的可能性0.01.

,这似乎非常高

1 个答案:

答案 0 :(得分: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播种。这产生了一个可接受的"许多案件的种子。您还可以从操作系统访问 true 随机数据,并将其用作种子或将其混合以生成更多随机数据。

  

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

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

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