안녕하세요, dev-desk 입니다.
c/c++ 에서 난수 값을 만드는 방법을 알아보겠습니다.
rand 함수를 통해 랜덤한 정수를 얻을 수 있습니다.
rand함수로 얻는 정수에는 특정 패턴이 존재합니다.
좀 더 확실히 랜덤 값을 생성하기 위해서는 추가작업이 필요합니다.
srand 함수와 time 함수를 조합하여 난수를 생성하는 방법은 여러 추가작업 중 가장 기초적인 방법입니다.
rand 함수부터 알아보겠습니다.
rand
함수 원형:
int rand();
헤더파일:
stdlib.h
설명:
0 ~ RAND_MAX 사이 중 하나의 정수를 반환합니다.
RAND_MAX는 stdlib.h 에 정의되어 있으며 32,767 입니다.
즉, rand 함수는 0 ~ 32,767 사이의 수 중 하나의 정수를 랜덤으로 생성하는 함수 입니다.
매개변수:
없음
반환값:
생성한 랜덤 정수
특징:
rand 함수는 출력하는 수의 패턴이 고정되어있기에 매 실행마다 똑같은 패턴을 출력합니다.
출력하는 패턴을 srand 함수를 이용하여 변경할 수 있습니다.
예제:
난수패턴을 변경하지 않으면 프로그램을 재실행하여도 위와 같이 41, 18467, 6334, 26500, 19169 .. 와 같은 고정된 난수패턴을 얻습니다.
고정된 난수 패턴은 srand 함수를 호출하여 변경할 수 있습니다.
srand
함수 원형:
void srand(unsigned int seed);
헤더파일:
stdlib.h
설명:
rand 함수가 출력하는 난수의 패턴을 변경하는 함수 입니다.
매개변수:
seed: seed 매개변수로 입력받는 정수와 매칭되어 있는 난수 패턴을 설정합니다.
반환값:
없음
특징:
난수의 패턴을 지정하는 함수로 rand 함수를 사용할 때는 거의 항상 같이 사용합니다.
예제:
seed 값에 따라 난수 패턴이 정해지므로 srand 함수를 사용한다 하더라도 난수라 부르기에는 아직 많이 부족합니다.
seed 값을 랜덤하게 주지 못하고 프로그램이 시작하면 고정된 정수를 seed 값으로 사용하기 때문입니다.
랜덤 정수를 구해 seed값을 주도록 time 함수를 활용할 수 있습니다.
time
함수 원형:
time_t time(time_t *timer);
설명:
1970년 1월 1일 0시 0분 0초 부터 세기 시작한 초단위 시간을 반환합니다.
매개변수:
timer: 구한 초단위 시간을 저장하는 변수입니다.
반환값:
구한 초단위 시간을 반환합니다.
특징:
time 함수는 시간을 구할 수 있는 함수 이지만 우리는 랜덤 값을 얻는 기법으로 time 함수를 응용합니다.
프로그램을 시작하는 순간의 초단위 시간을 seed 값으로 사용하는 것입니다.
사용자가 프로그램을 시작하는 순간의 초단위 시간은 매번 다르므로, time 함수를 호출하여 얻는 시간을 랜덤 seed 값으로 이용할 수 있습니다.
예제:
srand 함수의 매개변수로 time 함수의 반환값을 사용하면 프로그램이 시작될 때마다 seed값이 달라지며 난수를 다르게 얻어낼 수 있음을 확인할 수 있습니다.
난수의 범위 변경하기 (기초)
rand 함수로 생성한 난수는 0~32,767 사이의 값 입니다.
우리가 원하는 난수의 범위는 이와 다를 확률이 높습니다.
예를 들어 0~9 사이의 난수를 얻고 싶거나 32,767보다 큰 난수를 얻고 싶을 수도 있습니다.
나누기와 덧셈을 활용하면 쉽게 난수의 범위를 변경할 수 있습니다.
나눗셈의 나머지는 나누는 수를 넘어설 수 없다는 점을 활용하여 난수의 범위를 정합니다.
"어떤 수 % 5 = ?" 라는 수식을 예로 들겠습니다.
위 수식의 결괏값은 0~4 중 하나로 정해집니다.
즉, 어떤 수를 5로 나눈 나머지값은 0~4로 범위가 한정됩니다.
나머지값에 특정 값을 더해 난수 범위의 시작값과 끝값을 정할 수 있습니다.
위 수식에서 얻어지는 결괏값은 0~4이지만 여기에 5를 더하면 5~9의 수 중 하나로 정해집니다.
덧셈을 통해 난수 범위의 시작값과 끝값을 옮기는 셈입니다.
srand time rand 함수를 사용하여 난수를 얻고 나누기와 더하기를 이용하여 난수의 범위를 조정해 보았습니다.
여러 번 연습하면 원하는 난수 범위를 마음대로 지정하실 수 있을거에요.
끝까지 읽어주셔서 감사합니다.
오늘도 즐거운 프로그래밍 되세요!~
'개발지식 > c c++' 카테고리의 다른 글
[c/c++] strcmp strncmp 문자열 비교 함수 예시와 차이 (0) | 2024.10.17 |
---|---|
[c++] 숫자 분리자 digit separator 사용하여 긴 숫자 쉽게 읽기 (1) | 2024.10.14 |
[c] 메모리 동적 할당과 할당 해제 함수 malloc calloc realloc free (0) | 2024.06.01 |