본문 바로가기
프로그래밍/C언어

C언어 - 랜덤값

by LostJourney 2024. 6. 27.
반응형

개요

우리가 게임을 할때 가장 재미를 느끼는 부분이 언제일까? 사람마다 다르겠지만 나는 바로 확률이라고 생각한다.

이 확률을 설정하기 위해 무작위 값을 생성해 내야 하는데 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