gpt4 book ai didi

c - gsl_rng 函数 : in what order do they compile

转载 作者:行者123 更新时间:2023-11-30 17:41:46 25 4
gpt4 key购买 nike

我正在学习 gsl_rng 库并发现一个有趣的问题。

据我了解,环境变量(GSL_RNG_TYPEGSL_RNG_SEED)可用于设置库变量(gsl_rng_defaultgsl_rng_default_seed)在运行时(无需重新编译)。您只需添加 gsl_rng_env_setup() ,然后在执行 ./a.out 之前在终端中更改这两个变量。

但是,如果我在代码中专门设置了 gsl_rng_defaultgsl_rng_default_seed(例如使用“taus”和“12”),并编译了相同的程序,现在我无法在运行时更改种子值,但仍然可以更改生成器类型。

我对这些东西很陌生,所以可能我错过了一些东西。但任何人都可以帮助我理解为什么会发生这种情况吗?为什么这两个变量的行为不同?是否存在顺序或覆盖问题?

这是我的代码(简单练习):

#include <stdio.h>
#include <gsl/gsl_rng.h>

int main (void)
{
const gsl_rng_type * T; /*generator type*/
gsl_rng * r; /*rng instance*/

int i, n = 20;

gsl_rng_env_setup(); /*read from environment variable*/


T = gsl_rng_default; /*choose default generator type*/

gsl_rng_default = gsl_rng_mt19937;
gsl_rng_default_seed = 12;

r = gsl_rng_alloc (T); /*create an instance*/

for (i = 0; i < n; i++)
{
double u = gsl_rng_uniform (r);
printf ("%.5f\n", u);
}



gsl_rng_free (r); /*free all memory associated with r*/

return 0;
}

最佳答案

如果我们按执行顺序单步执行代码,我们会看到会发生什么:

gsl_rng_env_setup();      /*read from environment variable*/

so gsl_rnd_defaultgsl_rng_default_seed 现在包含来自环境的值,或者如果未设置,则使用库默认值。

T = gsl_rng_default;  /*choose default generator type*/

T 现在包含环境值的副本

gsl_rng_default = gsl_rng_mt19937;
gsl_rng_default_seed = 12;

现在我们已经覆盖了之前的两个值

r = gsl_rng_alloc (T);    /*create an instance*/

此时,由于 gsl_rng_alloc() 使用我们在参数中传递的生成器类型,因此 gsl_rng_default 被覆盖并不重要,因为我们传递的是 T,并且仍然包含之前的值的副本。但是,由于 gsl_rng_alloc() 将继续使用 gsl_rnd_default当前值,因此它会获取我们放在那里的 12。

如果您要在调用 gsl_rng_env_setup() 之前分配默认值,您将覆盖库默认值,那么您设置的那些值将被覆盖变量被设置,或者如果没有,则传递,这似乎是您真正想要的行为。

关于c - gsl_rng 函数 : in what order do they compile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21008842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com