티스토리 뷰

C | C++

난수 함수

야라바 2018. 6. 29. 11:25
728x90

☞ rand, srand

<stdlib.h>

int rand(void);
void srand(unsigned int seed);

C 프로그램에서 난수를 얻고자 하는 경우 라이브러리 함수에서는 나름의 seed를 가지고 있어서 다음에 어떤 난수를 발생시킬지를 관리합니다. 그래서, 프로그램 시작 지점에 동일한 seed를 지정했다면 난수 발생 순서가 동일할 수 있다는 것입니다. 프로그램 시작 지점에 seed가 동일하지 않도록 지정하는 것이 좋습니다.

srand()를 통해서 난수 발생기의 seed를 설정합니다. srand()로 seed를 설정하지 않은 상태로 rand()를 호출하면 기본 seed 값으로 1을 사용하게 됩니다. srand(time(0)) 처럼 호출하면 seed를 불규칙적으로 설정하는 간편하고 좋은 방법입니다. rand()함수를 통해서 0 ~ RAND_MAX 사이의 정수 형태로 난수 값을 받을 수 있습니다.



☞ 예제1

static int fi_handler_random_fail (THREAD_ENTRY * thread_p, void *arg, const char *caller_file, const int caller_line)
{
	static bool init = false;
	int r;
	int mod_factor;

	if (arg == NULL)
	{
		mod_factor = 20000;
	}
	else
	{
		mod_factor = *((int *) arg);
	}

	if (init == false)
	{
		srand ((unsigned int) time (NULL));
		init = true;
	}
	r = rand ();

	if ((r % mod_factor) == 0)
	{
		er_set (ER_NOTIFICATION_SEVERITY, caller_file, caller_line, ER_FAILED_ASSERTION, 1,
			"fault injection: random fail");

		return ER_FAILED;
	}

	return NO_ERROR;
}

위의 코드는 큐브리드 DBMS의 코드 일부로 난수 시드를 초기화해서 사용하는 과정을 참조할 수 있습니다.




728x90

'C | C++' 카테고리의 다른 글

산술 연산 함수  (0) 2018.06.29
정수 나누기 함수  (0) 2018.06.29
지수와 로그 함수  (0) 2018.06.29
삼각 함수  (0) 2018.06.29
시스템 로그  (0) 2018.06.29