[C]rand(), srand() 함수


#include<stdlib.h>

사용하기 위해서는 stdlib.h 헤더파일의 인크루드가 요구된다.

아래는 각 함수의 원형이다.


int    __cdecl rand(void);


void   __cdecl srand(_In_ unsigned int _Seed);

rand 함수는 0 ~ 32767까지의 수중에 한가지를 반환하는데 한번 메모리에 올라가고나면 다음 번지가 바뀌지 않는 이상 똑같은 수를 순차적으로 반환한다.(난수를 위한 함수지만 난수기능을 못한다…)

그래서 필요한것이 srand 함수인데 srand 함수를 통해 seed값을 주게되면 rand에서 반환하는 수가 변하게된다.

단, 특정수를 정해서 주게되면(이를테면 상수 1이나 2등… 프로그램이 실행될때마다 같은 수가 넘어가는 형태)기존 rand 함수만 사용한것과 차이가 없으며, 반드시 srand의 seed값이 프로그램 실행시마다 변동되는 수치를 넘겨주어야 한다.

일반적으로 time 함수를 사용하며, time 함수는 1970년 1월 1일부터 경과된 시간을 초단위로 반환하므로 프로그램이 실행된지 1초가 지나면 srand에 넘어가는 seed값이 변하게되어 rand함수의 반환값이 변동되게 된다.

rand함수는 맴버가 없고 정수형(int)을 반환하기때문에 사용할시에 아래와 같이 사용하면 된다.


int randValue = rand();

srand함수는 부호없는 정수형(unsigned int)을 맴버로 가지고 리턴값이 없기때문에 아래와 같이 사용하면 된다.


srand((unsigned int)time(NULL));

추가적으로 time함수의 반환값은 부호가 있는 정수형(int)이므로 부호없는 정수형(unsigned int)로 캐스팅이 필요하다.

1 ~ 10까지의 난수를 만드는 예제는 아래와 같다.


...
#include<stdlib.h>
int randValue;
srand((unsigned int)time(NULL));
randValue = (rand() % 10) + 1;
...