본문 바로가기

게임 개발 공부/언리얼엔진

UE5 | C++ - 난수 생성

언리얼과 C++을 포괄해서 난수를 생성하는 방법에는 여러가지가 있다.

함수마다 속도와 난수 품질이 달라 목적에 따라 선택해 사용할 수 있다.

대표적인 함수 몇개만 언급해보고자 한다.

 

1. FMath::Rand() (RandRange(Min, Max)) ( 언리얼 메소드)

- 반환값 : int32

- 범위 : 0 ~ RAND_MAX(32767) 사이의 정수(RandRange(Min, Max)는 Min~Max사이의 정수)

- 속도 : 빠름

- 난수 품질 :  낮음(패턴 있음)

int32 randNum = FMath::Rand();

 

2. FMath::FRand() (FRandRange(Min, Max)) (언리얼 메소드)

- 반환값 : float

- 범위 : 0.0 ~ 1.0 사이의  부동소수점 (FRandRange(Min, Max)는 Min~Max사이의 부동소수점)

- 속도 : 빠름

- 난수 품질 : 낮음(패턴 있음)

float RandNum = FMath::FRand();

 

3. FPlatformMath::Random() ("HAL/PlatformMath.h")

- 반환값 : int32

- 범위 : 0 ~ MAX_INT32 (2,147,483,647)

- 속도 : 보통

- 난수 품질 : 보통(플랫폼 별 최적화) 

int32 RandNum = FPlatformMath::Random();

 

4. std::mt19937(seed) (메르센 트위스터) (<random>)

- 반환값 : int

- 범위 : 0 ~ (2^32 - 1) (4294967295, 즉 4,294,967,295)

- 속도 : 느림

- 난수 품질 : 좋음(정교한 패턴)

std::mt19937 gen(42);  // 시드를 42로 고정
int32 RandNum = gen();

 

5. std::random_device (<random>)

- 반환값 : unsigned int

- 범위 : 0 ~ 4,294,967,295

- 속도 : 가장 느림

- 난수 품질 : 아주 좋음(완전 난수)

std::random_device rd;
int32 RandNum = rd();