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 알고리즘
   57   58   59   60   61   62   63   64   65   66   67