rand(), srand() 함수 개념 정리
C언어에서는 그러한 프로그래머를 위해서 난수생성함수를 제공하고 있습니다. 바로 rand라는 함수이지요. 외우기도 쉽네요. rand(om)으로 기억하면 되니까요.
rand
rand함수를 사용하기 위해서는 stdlib.h 헤더파일을 include해야합니다. rand함수는 0부터 RAND_MAX까지 범위까지 난수를 생성합니다. 함수 원형을 같이보시죠.
int rand(void); |
보시는 바와 같이 rand함수는 int형을 반환하게 됩니다.
아하, 그러면 rand함수를 쓰게 되면 랜덤인 정수형이 나오겠구나. 알 수 있죠?
이제 이 함수를 이용해서 1부터 100까지 정수 중 10개의 수를 랜덤하게 뽑아내는 프로그램을 짜보도록 하지요.
#include <stdio.h>
#include <stdlib.h>
int main() {
int i;
for (i = 1; i <= 10; i++)
printf("%d ", (rand() % 100) + 1);
// 나눗셈 연산기호 사용하는 이유 → 100으로 나누면 0-99까지의 나머지 발생, +1해서 1부터 100까지 난수 발생
printf("\n");
}
프로그램을 실행할때마다 바뀌지 않는데요? 우리는 이런 랜덤한 값을 원한게 아닙니다. 우리는 프로그램을 실행할때마다 랜덤하게 10개의 수를 출력하는 프로그램을 원하는 건데요. 지금 출력된 것은 단지 일정한 숫자 배열을 출력한 것과 같다고 느껴집니다.
→ rand() 함수는 한 개의 난수 생성 배열을 계속 생성, 실행할 때마다 새로운 난수를 생성하는 것이 아님
srand
사실 rand함수는 srand함수에 의존적입니다. srand의 s는 seed라는 뜻으로 이 seed값에 따라 rand의 값이 바뀌게 됩니다. srand는 rand함수와 같이 stdlib.h 헤더파일에 존재합니다.
만일 이 함수를 호출하지 않고 rand함수를 호출한다면 srand(1)을 호출하고 rand함수를 호출한 효과와 같습니다.
함수의 원형은 다음과 같은데요.
void srand(unsigned int seed); |
양의 정수만 seed로 사용할 수 있습니다.
seed에는 난수를 생성하기 위한 시드 값을 지정한다. 난수는 seed로 지정된 값을 초기 값으로 난수를 생성한다. seed에 1을 지정하면 난수가 초기화된다. srand ()를 호출하기 전에 rand()가 호출된 경우 seed를 1로 난수 열이 생성된다.
프로그램을 실행할 때마다 예기치 못한 적당한 값을 얻기 위해서는 항상 다른 시드를 부여해야 한다. 난수의 생성에 가장 많이 사용되는 초기 값은 시간이다. time() 함수를 사용하여 얻은 값은 항상 다른 값이 되기 때문에 개발자도 예상할 수 없는 적당한 값을 동적으로 얻을 수 있다.
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main() {
int iCount;
srand(time(NULL));
for(iCount = 0 ; iCount < 10 ; iCount++)
printf("난수 열 %d = %d\n" , iCount , rand());
return 0;
}
rand() 함수를 호출하기 전에 srand() 함수를 이용하여 난수의 초기 값을 지정한다. time() 함수를 사용하여 현재 시간 값을 시드로 지정하고 있기 때문에 이 프로그램을 실행할 때마다 다른 초기 값을 난수의 생성에 사용한다. 이번에는 실행할 때마다 적당한 값을 얻을 수 있을 것이다.
그러나 이 상태에서는 특정 범위의 난수를 얻을 수 없다. 일반적으로 32767까지의 넓은 범위의 난수를 사용하지 않는다. 반대로, 경우에 따라서는 32767 이상의 넓은 범위의 난수를 얻고 싶을 때도 있을 것이다. 이것을 실현하려면 rand() 함수에서 얻은 결과를 계산하고 해결한다. 지정 범위의 난수를 얻는 가장 쉬운 방법은 난수와 최대 값을 나눈 나머지 값을 얻는 방법이다. 0~9의 난수가 필요한 경우는 rand() % 10를 계산하여 얻을 수 있다.