gsl_rng 라이브러리를 배우고 흥미로운 질문을 찾았습니다.gsl_rng functions : 어떤 순서로 컴파일합니까?
나는 환경 변수 (GSL_RNG_TYPE
및 GSL_RNG_SEED
가) 실행 시간 동안 라이브러리 변수 (gsl_rng_default
및 gsl_rng_default_seed
)을 설정하는 데 사용할 수 있습니다 (재 컴파일없이) 것으로 알고 있습니다. gsl_rng_env_setup()
을 추가하고 터미널에서이 두 변수를 변경하기 전에 ./a.out
을 수행하기 만하면됩니다.
그러나 동일한 프로그램이 컴파일 된 상태에서 코드에 gsl_rng_default
및 gsl_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;
}
나는 또한 혼란이 매우 가난한 인터페이스 설계 이후 변명이라고 말하고 싶다 - 암시 적으로 쓰여지고 사용되는 하나의 기본값을 가지고 있고, 하나의 "기본값"을 읽고 매개 변수로 명시 적으로 전달한 것은 ... 의문 스럽다. 베스트. – Notlikethat
답변 해 주셔서 감사합니다! 하지만 실행 순서 때문에 gsl_rng_env_setup() 중에 이전에 발생하는 값을 프로그램에서 읽은 후에도 라이브러리 값을 mt19937 및 12로 명시 적으로 덮어 씁니다. 그러나 프로그램은 여전히 모든 생성기 유형 사용자 입력을 사용하지만 seed 값 12를 사용합니다. 따라서 런타임 중에 taus 및 4를 입력하면 프로그램은 taus 및 12를 결과로 사용합니다. 정말 이상합니다. 두 변수가 같은 방식으로 작동 할 것으로 기대합니다. – CrazyFrog