① rand
필요한 헤더파일: C언어 <stdlib.h> / C++ <cstdlib>
#include <stdio.h>
#include <stdlib.h>
int main(void){
for (int i = 0; i < 5; ++i) {
printf("rand : %d\n", rand());
}
}
랜덤한 숫자이기 하지만 실행할 때마다 동일한 (랜덤) 숫자를 생성하는 단점이 있습니다.
생성되는 난수의 범위는 0 ~ RAND_MAX 까지 입니다.
(RAND_MAX는 0x7fff로 10진수로 0 ~ 32767가 생성 범위 입니다.
※ RAND_MAX는 stdlib.h 헤더파일에 정의되어 있는 수치 입니다.
(함수명에서 F12를 누르면 헤더파일을 쉽게 확인할 수 있습니다.)
[stdlib.h에서 344번째 줄]
② srand
필요한 헤더파일: C언어 <stdlib.h> / C++ <cstdlib>
rand() 함수는 srand함수에 의존적입니다.
srand의 "s"는 seed라는 뜻으로 인자로 주어진 수치에 따라 rand() 값을 변경시킵니다.
(양의 정수만 seed 인자로 줄 수 있습니다.)
(srand 함수를 호출하지 않고, rand() 호출한다면 srand(1)로 설정된 상태라고 보시면 됩니다.)
#include <stdio.h>
#include <stdlib.h>
int main(void){
printf("1....\n");
srand(1);
for (int i = 0; i < 5; ++i) {
printf("rand : %d\n", rand());
}
printf("\n2....\n");
srand(2);
for (int i = 0; i < 5; ++i) {
printf("rand : %d\n", rand());
}
}
void srand(unsigned int seed);로 생성되는 랜덤값을 변화시켰지만
실행할 때마다 동일한 Pattern의 랜덤 값을 생성하는 단점은 여전합니다.
매번 실행할 때마다 다른 랜덤값을 가지게 하는 방법으로는 인자로 "시간"을 주는 것입니다.
③ srand + time
필요한 헤더파일: C언어 <stdlib.h>, <time.h> / C++ <cstdlib>, <ctime>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void){
printf("1....\n");
srand(time(NULL));
for (int i = 0; i < 5; ++i) {
printf("rand : %d\n", rand());
}
printf("\n2....\n");
srand(time(NULL));
for (int i = 0; i < 5; ++i) {
printf("rand : %d\n", rand());
}
}
하나의 실행단위에서는 실행되는 시점에서 시간의 큰 변화가 없기 때문에 동일한 seed가 주어진 결과가 나왔습니다.
하지만 srand(time(NULL));사이에 시간이 어느정도 소용되는 구간이 발생한다면 다른 결과가 나올 것입니다.
실제 다른 시간에 동일한 코드를 실행하면 다른 값이 나오는 것을 확인할 수 있습니다.
※ time 함수: UCT 기준 1970년 1월 1일 0시 0분 0초 부터 경과된 시간을 초(sec)로 반환하는 함수
time 함수를 이용해서 연/월/일/시/분/초로 표현하기 위해서는 추가적인 작업이 필요하지만,
매 시간마다 다른 수치를 srand() 인자로 주는 것이 목적이므로 생략
(time(NULL)은 반환형이 time_t인데 time_t는 long long 타입 입니다.)
'프로그래밍 언어 > C 언어' 카테고리의 다른 글
[C] 중첩 for문 (한번에) 빠져나오기 (0) | 2021.03.19 |
---|---|
[C] [전처리기] 헤더파일(.h) 만들어서 include 하기 (2) | 2021.03.06 |
[C] #include "헤더파일" & #include <헤더파일> (0) | 2021.03.06 |
[C] [전처리기] 매크로와 선행처리기 (0) | 2021.03.03 |
[예제] srand()를 이용한 1~10까지의 난수 생성 (0) | 2021.02.23 |
댓글