Page 62 - Do it! 자료구조와 함께 배우는 알고리즘(C 언어, 3쇄)
P. 62
이렇게 되는 이유는 생성되는 난수의 순서, 즉 프로그램에서 첫 번째 생성되는 난수, 두 번째 생성되는
난수, 세 번째 생성되는 난수가 정해져 있기 때문입니다. 예를 들어, 어떤 컴퓨터 환경에서는 항상 아래
와 같은 순서로 난수가 생성됩니다.
16,838 ⇒ 5,758 ⇒ 10,113 ⇒ 17,515 ⇒ 31,051 ⇒ 5,627 ⇒ …
왜냐하면 rand 함수는 ‘seed(씨앗)’를 사용하여 난수를 생성하기 때문입니다. ‘seed(씨앗)’가 상숫값 1
로 rand 함수에 심어져 있다고 가정할 경우 rand 함수는 프로그램을 실행할 때마다 상숫값 1을 기준
으로 매번 같은 순서의 난수를 생성합니다.
이때 seed(씨앗)의 값을 변경하는 것이 srand 함수입니다. 예를 들어,
srand(50); /* seed(씨앗)의 값을 50으로 설정 */
와 같이 50을 매개변수로 전달하며 srand 함수를 호출하면 seed(씨앗)의 값을 변경할 수 있습니다. 하
지만 이렇게 해도 같은 문제가 발생합니다. 상수(seed 값)를 전달하는 srand 함수를 호출한다 해도 이
후에 rand 함수가 생성하는 난수의 순서는 그 seed(씨앗)의 값을 기준으로 정해진다는 것입니다. 앞의
예제와 같은 컴퓨터 환경에서 seed(씨앗)를 50으로 설정하면 생성되는 난수는 아래와 같습니다.
22,715 ⇒ 22,430 ⇒ 16,275 ⇒ 21,417 ⇒ 4,906 ⇒ 9,000 ⇒ …
그러므로 srand 함수에 전달하는 매개변수는 임의의(random) 난수여야 합니다. ‘난수를 생성하기 위
해 난수가 필요하다’는 말이 우습게 들릴 수도 있겠지만 이 문제를 해결하기 위해 일반적으로 사용하는
방법 중 하나는 srand 함수에 현재 시간의 값을 주는 방법입니다.
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
/* … 중략 … */
srand(time(NULL));
x = rand(); /* 0 이상 RAND_MAX 이하의 난수를 생성 */
y = rand(); /* 0 이상 RAND_MAX 이하의 난수를 생성 */
printf("x 값은 %d이고 y 값은 %d입니다.\n", x, y);
time 함수가 반환하는 값은 time_t형의 값인 ‘현재 시간’입니다. 따라서 프로그램을 실행할 때마다 시
62 C 알고리즘