컴퓨터/C
다양한 프로그래밍에는 난수 즉 랜덤으로 숫자를 생성하여 사용하는 경우가 많이 있습니다.
C언어에서는 이런 난수를 생성하기 위한 라이브러리를 제공합니다.
난수를 생성하기 위한 함수들은 stdlib.h를 추가하여야만 정상적으로 사용할 수 있습니다.
#include<stdio.h> // 표준 입출력 라이브러리 헤더
#include<stdlib.h> // 난수 생성 기능이 있는 라이브러리 헤더
rand() 함수를 호출함으로써 난수를 생성할 수 있습니다. 이 함수의 원형은 아래와 같습니다.
int rand();
이 함수와 %연산을 이용해서 100 이하의 숫자 3개를 랜덤으로 뽑아내 보도록 하겠습니다.
#include<stdio.h>
#include<stdlib.h>
int main() {
for (int i = 0; i < 3; i++) {
printf("%d\n", (rand() % 100));
}
return 0;
}
위의 화면처럼 rand함수를 통해 랜덤숫자를 뽑아내어 출력할 수 있습니다. 하지만 위 프로그램은 한 가지 큰 문제점이 있습니다. 바로 다시 프로그램을 실행해도 동일한 숫자 결과가 나오게 됩니다. 항상 랜덤 한 값을 받고 싶은 경우 문제가 생깁니다.
위와 같은 결함이 생기는 이유는 바로 rand 함수를 호출하면 랜덤한 값을 생성하는 것이 아닌 특정한 값들이 저장돼 있는 곳에서 값을 순서대로 추출하기 때문입니다. 그렇기 때문에 특정한 값들이 저장되어 있는 공간이 바뀌지 않는 다면 계속해서 동일한 값을 출력하게 됩니다.
그 특정한 값이 저장되어 있는 공간의 값들을 변경시키기 위한 함수가 바로 srand() 함수입니다. 정리하자면 아래와 같습니다.
그렇다면 srand()를 이용해서 특정한 공간에 저장되어 있는 값들의 설정을 변경하고 실행해 보도록 하겠습니다.
#include<stdio.h>
#include<stdlib.h>
int main() {
srand(2);
for (int i = 0; i < 3; i++) {
printf("%d\n", (rand() % 100));
}
return 0;
}
srand를 사용하지 않았을때와는 다른 랜덤 한 숫자가 나오는 것을 확인할 수 있습니다. 하지만 위처럼 프로그래밍을 한다 하더라고 srand(2)를 통해 계속해서 특정한 임의의 값들이 설정되어 있기 때문에 프로그램을 다시 실행하면 동일한 결과가 나오게 됩니다. 프로그램을 실행할 때마다 srand()의 인자 값을 변경해야만 원하는 결과를 만들어 낼 수 있습니다.
결국 위의 결과로 유추해 본다면 srand의 인자값이 변화된다면 매번 생성되는 난수의 값도 변화된다는 것을 알 수 있습니다. 여러 보안이나 이런 이유로 다양한 방법으로 난수를 생성하기 위한 srand의 인자 값을 만들 수 있지만 가장 쉽고 대표적인 예제는 바로 시간을 통해서 srand를 설정하는 방법입니다.
C언에서 시간에 내용은 다음 포스트에서 다루기로 하고 본 포스트에서는 time함수를 통해서 srand를 그리며 매번 프로그램이 실행될 때마다 다른 난수를 생성할 수 있는 소스코드로 마무리하겠습니다.
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main() {
srand(time(NULL));
for (int i = 0; i < 3; i++) {
printf("%d\n", (rand() % 100));
}
return 0;
}
위와 같이 srand에 인자로 time(NULL)을 통해 시간에 따라 srand의 값이 변화되며 추출하는 데이터가 변화되게 할 수 있습니다.
C 언어 - NULL (0) | 2021.09.30 |
---|---|
C 언어 - 거품정렬 구현해보기 (0) | 2021.09.27 |
C언어 - Single linked list(단일 연결 리스트) 구현해보기 (0) | 2021.09.06 |
C 언어 - 배열의 한계 (선언과 동시에 크기의 불변) (0) | 2021.09.05 |
C 언어 - 실습 - 학생관리 프로그램Ver.4.2(파일 불러오기) (0) | 2021.08.05 |
91년생 공학엔지니어의 개발일지
TODAY :
YESTER DAY :
TOTAL :
Commnet