Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C gsl_rng函数:它们以什么顺序编译_C_Random_Gsl - Fatal编程技术网

C gsl_rng函数:它们以什么顺序编译

C gsl_rng函数:它们以什么顺序编译,c,random,gsl,C,Random,Gsl,我正在学习gsl_rng图书馆,发现了一个有趣的问题 我了解环境变量(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 env\u setup(),然后在执行/a.out之前在终端中更改这两个变量 但是,如果我在代码中专门设置了gsl\u rng\u default和gsl\u rng\u default\u

我正在学习gsl_rng图书馆,发现了一个有趣的问题

我了解环境变量(
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 env\u setup()
,然后在执行
/a.out
之前在终端中更改这两个变量

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

我是新来的,所以我可能错过了一些东西。但谁能帮我理解为什么会发生这种情况?为什么这两个变量的行为不同?是否存在订单或超额写入问题

以下是我的代码(简单实践):

#包括
#包括
内部主(空)
{
常数gsl\U rng\U型*T;/*发电机型*/
gsl_rng*r;/*rng实例*/
int i,n=20;
gsl_rng_env_setup();/*从环境变量读取*/
T=gsl\u rng\u default;/*选择默认发电机类型*/
gsl_rng_default=gsl_rng_mt19937;
gsl_rng_default_seed=12;
r=gsl_rng_alloc(T);/*创建一个实例*/
对于(i=0;i
如果我们按执行顺序逐步执行代码,我们会看到发生了什么:

gsl_rng_env_setup();      /*read from environment variable*/
因此
gsl\u rnd\u default
gsl\u rng\u default\u 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\u rng\u alloc()
使用我们在参数中传递的生成器类型,因此
gsl\u rng\u default
被覆盖并不重要,因为我们传递的是
t
,并且它仍然包含来自该参数的值的副本。但是,由于
gsl\u rng\u alloc()
将继续使用
gsl\u rnd\u default
的当前值,因此它会得到我们放在那里的12


如果在调用
gsl\u rng\u env\u setup()
之前指定默认值,则会覆盖库默认值,如果设置了环境变量,则会覆盖您设置的值,如果未设置,则会传递这些值,这似乎是您真正想要的行为。

我还想说,混淆是可以原谅的,因为这是一个非常糟糕的接口设计-有一个默认值被写入并隐式使用,还有一个“默认值”必须读取并作为参数显式传递是。。。最多也有问题。谢谢你的回答!但正如您所说,由于执行顺序的原因,即使在程序从用户处读取值之后,我也会显式地将库值覆盖到mt19937和12,这在gsl_rng_env_setup()期间发生。然而,程序仍然使用任何生成器类型的用户输入,但坚持使用种子值12。因此,如果我在运行时输入taus和4,程序将使用taus和12作为结果。真奇怪。我希望这两个变量的行为方式相同
r = gsl_rng_alloc (T);    /*create an instance*/