2014-01-08 3 views
0

gsl_rng 라이브러리를 배우고 흥미로운 질문을 찾았습니다.gsl_rng functions : 어떤 순서로 컴파일합니까?

나는 환경 변수 (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; 
} 

답변

0

, 우리는 어떻게되는지 :

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

그래서 gsl_rnd_defaultgsl_rng_default_seed 이제 값을 포함 환경에서 가져 오지 않거나 설정되지 않은 경우 라이브러리가 기본값으로 설정됩니다. gsl_rng_alloc() 발전기 유형을 사용하기 때문에

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*/ 

에서 환경 값의 복사본이 들어 있습니다 매개 변수를 전달하면 T을 전달하기 때문에 gsl_rng_default을 덮어 쓰는 것이 중요하지 않으며 그 stil l 미리 값의 복사본이 있습니다. 그러나 gsl_rng_alloc()의 현재 값을 gsl_rnd_default으로 사용하기 때문에 Google에서 입력 한 12 개를 가져옵니다. 당신이 라이브러리 기본값을 덮어 쓸 것, gsl_rng_env_setup()를 호출하기 전에 기본값 을 할당한다면 환경 변수가 설정하거나 그렇지 않은 경우에 통과하는 경우

, 당신은 설정된 값은 덮어 쓰기됩니다 그것은 당신이 정말로 원하는 행동처럼 보입니다.

+0

나는 또한 혼란이 매우 가난한 인터페이스 설계 이후 변명이라고 말하고 싶다 - 암시 적으로 쓰여지고 사용되는 하나의 기본값을 가지고 있고, 하나의 "기본값"을 읽고 매개 변수로 명시 적으로 전달한 것은 ... 의문 스럽다. 베스트. – Notlikethat

+0

답변 해 주셔서 감사합니다! 하지만 실행 순서 때문에 gsl_rng_env_setup() 중에 이전에 발생하는 값을 프로그램에서 읽은 후에도 라이브러리 값을 mt19937 및 12로 명시 적으로 덮어 씁니다. 그러나 프로그램은 여전히 ​​모든 생성기 유형 사용자 입력을 사용하지만 seed 값 12를 사용합니다. 따라서 런타임 중에 taus 및 4를 입력하면 프로그램은 taus 및 12를 결과로 사용합니다. 정말 이상합니다. 두 변수가 같은 방식으로 작동 할 것으로 기대합니다. – CrazyFrog

관련 문제