개요
우리가 게임을 할때 가장 재미를 느끼는 부분이 언제일까? 사람마다 다르겠지만 나는 바로 확률이라고 생각한다.
이 확률을 설정하기 위해 무작위 값을 생성해 내야 하는데 C언어에서는 이러한 난수 생성에 표준 라이브러리 함수(stdlib.h) 'rand()'와 'srand()'를 사용한다.
오늘은 임의의 값을 생성하는 함수에 대해 알아보자.
rand()
#include <stdio.h>
#include <stdlib.h>
int main() {
int randomValue = rand();
printf("Random value: %d\n", randomValue);
return 0;
}
'rand()' 함수는 0에서 'RAND_MAX' (stdlib.h 에 정의되어있는 상수로 일반적으로는 32767로 설정되어있다.) 범위의 무작위 정수를 생성한다.
하지만 위 코드를 실행시켰을때 매번 같은 정수가 출력된다는것을 알 수 있다. 이는 난수 생성에 필요한 'seed'가 없기 때문이다.
srand()
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand((unsigned int)time(nullptr)); // 현재 시간을 통해 시드값 생성
int randomValue = rand();
printf("Random value: %d\n", randomValue);
return 0;
}
'srand()' 함수는 위의 'rand()' 함수에서 필요한 seed값을 생성하여 rand() 함수로 넘겨준다.
위의 경우 <time.h>*에서 현재의 시간을 구하는 함수를 통해 seed값을 설정해 준다.
이때 'srand()' 함수는 unsigned int형을 필요로 한다.
이렇게 seed값을 넣어준 rand()함수는 시작시간에 따라 생성하는 값이 달라지게 된다.
* time() : 임력한 값의 시간값을 초 단위로 반환한다. 기준은 1970년 1월 1일 0시 0분 0초이다.
int range = 5 // 범위
int lower_bound = 5 // 최소 값
int randomValue = rand() % range + lower_bound; // 최소값 5 부터 9까지의 값을 반환
위와 같이 %, + 같은 연산자를 사용하여 난수 생성에 특정 범위를 지정할 수 있다.
결론
C에서의 난수 생성은 간단하지만 그만큼 불안정한 유사 난수 생성기이다. seed값을 알아낸다면 그 패턴을 알아낼 수 있어 보안이나 게임의 중요한 코드에 치명적이기 때문이다.
따라서 이 함수는 보통 중요도가 떨어지거나 성능상의 최적화가 우선시 되는 상황에서 주로 사용되며 중요한 난수값은 주로 C++에서 사용되는 메르센 소수점을 이용한 방식이나 가이거 계수를 이용한 진정한 난수를 생성하는 방식으로 구현한다.
'프로그래밍 > C언어' 카테고리의 다른 글
C언어 - 문자열과 string.h (3) | 2024.06.30 |
---|---|
C언어 - 배열 (array) (0) | 2024.06.30 |
C언어 - 형변환 (1) | 2024.06.23 |
C언어 - 제어문 (1) | 2024.06.16 |
C언어 - 반복문 (2) | 2024.06.10 |