반응형
C 언어에서 게임이나 시뮬레이션을 만들 때 필수적인 기능이 바로 난수(Random Number) 생성입니다. 하지만 단순히 rand() 함수만 사용했다가 실행할 때마다 매번 같은 결과가 나와 당황하신 적 있으시죠?
이번 포스팅에서는 C언어의 난수 생성 원리부터, 실행마다 값이 바뀌게 하는 시드(Seed) 설정법, 그리고 실무에서 바로 써먹는 범위 지정 공식까지 총정리해 드립니다.

1. rand() 함수: 의사 난수의 한계
rand() 함수는 <stdlib.h>에 정의되어 있으며, 0부터 RAND_MAX(일반적으로 32767) 사이의 정수를 반환합니다.
문제점: 실행할 때마다 같은 값이 나온다?
C
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("난수: %d\n", rand()); // 항상 같은 값이 출력됨
return 0;
}
rand()는 내부적으로 특정 공식에 의해 생성되는 '의사 난수(Pseudo-random)'이기 때문에, 초기 시작점(Seed)이 같으면 항상 동일한 시퀀스를 출력합니다. 이를 해결하기 위해 srand가 필요합니다.
2. srand()와 time()으로 진짜 랜덤 만들기
매번 다른 난수를 얻으려면 시드(Seed)를 계속 바꿔줘야 합니다. 가장 좋은 방법은 '현재 시간'을 시드로 사용하는 것입니다.
- 헤더: <time.h> 추가 필요
- 코드: srand(time(NULL));
C
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand((unsigned int)time(NULL)); // 현재 시간을 시드로 설정
for(int i = 0; i < 3; i++) {
printf("난수 %d: %d\n", i + 1, rand());
}
return 0;
}
3. [공식] 특정 범위의 난수 생성하기
가장 질문이 많은 부분입니다. rand() 결과값을 우리가 원하는 범위로 한정 짓는 방법입니다.
3.1. 기본 공식
(rand() % (최대값 - 최소값 + 1)) + 최소값
3.2. 실전 적용 예제
C
// 1~100 사이의 난수
int num1 = (rand() % 100) + 1;
// 10~50 사이의 난수
int num2 = (rand() % 41) + 10;
4. 실전 활용 예제 (응용)
4.1. 주사위 및 동전 던지기
C
// 주사위 (1~6)
int dice = (rand() % 6) + 1;
// 동전 (0: 앞면, 1: 뒷면)
int coin = rand() % 2;
4.2. 배열 요소 랜덤 선택 (아이템 드랍 등)
C
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
const char *items[] = {"검", "방패", "물약", "마법서"};
int size = sizeof(items) / sizeof(items[0]);
srand((unsigned int)time(NULL));
printf("획득한 아이템: %s\n", items[rand() % size]);
return 0;
}
5. 난수 생성 시 주의사항 및 품질 개선
- srand()는 한 번만 호출: srand를 루프(loop) 안에 넣으면 시간이 바뀌기 전까지(1초 단위) 같은 값만 나옵니다. 반드시 프로그램 시작 시 딱 한 번만 호출하세요.
- 보안이 중요하다면?: 표준 rand()는 암호학적으로 안전하지 않습니다. 보안 관련 프로젝트라면 현대적인 C++의 <random> 라이브러리나 OS 전용 API 사용을 고려해야 합니다.
6. 요약 표
| 함수 | 역할 | 비고 |
| rand() | 난수 생성 | 0 ~ RAND_MAX 사이값 반환 |
| srand(seed) | 난수 생성기 초기화 | 시드값에 따라 난수 시퀀스 결정 |
| time(NULL) | 현재 시간 반환 | 시드값을 유동적으로 만들 때 사용 |
포스팅이 도움이 되셨다면 하트(♥)와 댓글 부탁드립니다!
임베디드 소프트웨어 및 최적화 기법에 대한 전문적인 정보는 'Coding by Head' 블로그에서 계속됩니다.
반응형
'Core Programming > C Standard Library: Resource & Performan' 카테고리의 다른 글
| C언어 ctype.h 완벽 정리: 문자 판별 및 대소문자 변환 함수 예제 (0) | 2025.03.01 |
|---|---|
| C언어 qsort, bsearch 완벽 가이드: 배열 정렬과 이진 탐색 예제 (0) | 2025.02.28 |
| C언어 종료 처리 완벽 가이드: atexit와 quick_exit 차이점 및 활용법 (0) | 2025.02.26 |
| C언어 system, exit, abort 함수 완벽 정리: 차이점과 실무 사용법 (0) | 2025.02.25 |
| C언어 환경 변수 완벽 가이드: getenv, setenv, putenv 차이점과 예제 (0) | 2025.02.24 |