C 언어에서 지정된 범위 내의 난수를 생성하는 방법을 알아보겠습니다. 이 문제를 해결하기 위해 srand() 함수를 사용하며, 현재 시간을 시드(seed) 값으로 활용합니다.
rand() 함수는 임의의 범위를 지정할 수 없고 0부터 특정 값 사이의 숫자만 생성한다는 한계가 있습니다. 따라서 간단한 트릭이 필요합니다. 먼저 0부터 (상한값 − 하한값 + 1) 사이의 난수를 생성한 뒤, 하한값을 더해 오프셋(offset)을 적용하면 원하는 범위의 난수를 얻을 수 있습니다.
예제 코드
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void generate_random(int l, int r, int count) {
// l과 r 사이의 난수를 count번 생성
int i;
for (i = 0; i < count; i++) {
int rand_num = (rand() % (r - l + 1)) + l;
printf("%d ", rand_num);
}
}
main() {
int lower = 10, upper = 15, count = 15;
srand(time(0)); // 현재 시간을 난수 생성기의 시드로 사용
generate_random(lower, upper, count);
printf("\n");
}위 코드에서 (rand() % (r - l + 1)) + l 부분이 핵심입니다. rand() % (r - l + 1)은 0부터 (r − l)까지의 값을 만들어내고, 여기에 하한값 l을 더함으로써 최종적으로 l부터 r 사이의 정수가 생성됩니다.
실행 결과
15 11 13 10 13 10 15 11 14 12 12 13 12 13 14
실행 결과를 보면 10부터 15 사이의 숫자들이 총 15개 출력되었습니다. 프로그램을 실행할 때마다 시드 값이 달라지므로 매번 다른 결과가 나타납니다.
주요 포인트 정리
- srand(time(0)): 현재 시간을 시드로 설정하여 실행할 때마다 다른 난수 시퀀스를 얻습니다.
- rand() % (r - l + 1): 원하는 범위의 크기로 나머지 연산을 수행해 범위 내 값으로 제한합니다.
- + l: 하한값을 더해 최종 범위를 조정합니다.
참고로 이 방법은 모듈로 연산의 특성상 완벽하게 균등한 분포를 보장하지는 않지만, 대부분의 일반적인 용도에서는 충분히 실용적입니다.