【问题标题】:Rust GSL library always returns the same number for a random number generatorRust GSL 库总是为随机数生成器返回相同的数字
【发布时间】:2015-10-05 00:11:58
【问题描述】:

我在 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.,这似乎真的很高

【问题讨论】:

    标签: random rust


    【解决方案1】:

    env_setup 的文档解释了您需要了解的所有内容:

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

    如果您没有为 GSL_RNG_TYPE 指定生成器,则默认使用 gsl_rng_mt19937gsl_rng_default_seed的初始值为零。

    (强调我的)

    与所有软件随机数生成器一样,这实际上是一种生成随机数的算法。该算法和初始种子唯一地标识这些数字的序列。由于种子始终相同,因此序列中的第一个(以及第二个、第三个、...)数字将始终相同。

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

    没错。

    其他语言似乎没有这个限制,这意味着可以根据需要手动设置种子,否则是随机的。

    执行此操作的经典方法是使用当前时间为您的 RNG 播种。对于许多情况,这会产生“可接受的”种子。您还可以从操作系统访问 true 随机数据,并将其用作种子或将其混合以产生更多随机数据。

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

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

    您甚至可以做一些疯狂的事情,例如使用 rand crate 中的随机值来为您的其他随机数生成器播种。我只是假设您使用该板条箱而不是 rand 有一些重要原因。

    【讨论】:

    • 感谢您的来信。我认为它使用的是相同的种子。所以我更仔细地查看了文档,有一件事令人困惑。所以如果我想生成一系列新的随机数,那么我每次都需要改变种子。但是,如果我使用 rng 生成一组随机种子,那么我每次都会得到相同的种子。所以我永远无法真正摆脱伪随机生成器的确定性一面。其他语言似乎没有这个限制,这意味着可以根据需要手动设置种子,否则是随机的。 Rust 有没有办法做到这一点?
    • 哦,谢谢@Shepmaster。是的,我必须使用 rgsl crate,因为它具有生成二项式随机变量的功能。不过,这确实很有帮助。我现在知道这是如何工作的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    相关资源
    最近更新 更多