---C++ 역량 강화---/STL 공부

default_random_engine, distribute, random_device

코리아탑클 2024. 5. 31. 10:30

[[[서론]]]

c++ 표준에는 랜덤값을 추적 불가능 하게 만들라고 권고하고 있다.

랜덤이라는 것은 예측 불가능 이라는 의미다.

지구에는 지금도 어디선가 벼락이 떨어지고 있는데 어디서 떨어질지 우리는 전혀 알 수 없다.

그것을 예측 불가능 하다고 말한다.

 

[[default_random_engine]]

기본 엔진이지만 매우 강력하다.

19937개의 비트 상태를 갖고 있으며 Mersenne 소수에 기반한 다항식을 사용하여 난수를 생성한다. 따라서 추적하기에 매우 복잡하다.

다항식을 통해 만들기 때문에 100% 예측이 불가능한것은 아니지만 인간이 할 수 없을 정도로 복잡하기 때문에 사실상 불가능한 것이다.

따라서 이것을 Pseudo - random number generation 이라고 한다. 가짜 - 랜덤 숫자 생성기라는 뜻이다.

100% 랜덤은 아니라서 가짜라는 표현은 했지만 절대 추적 불가능한 것이다.

 

[[distribute]]

분포인데 c++reference에 들어가보면 굉장히 많은 분포들이 존재한다.

기본적으로 균등분포와 정규분포를 많이 사용한다.

정규분포는 아이템 드랍 확률이나 랜덤 몬스터 능력치, 캐쉬 아이템 확률등에 사용할 수 있다.

https://koreatopclass.tistory.com/9 << 참고

랜덤 엔진에서 난수를 생성하였다면 분포에서는 생성된 난수를 분포에 맞게 변환한다.

따라서 난수를 만들기 위해서 랜덤엔진은 분포와 결합해야 한다.

 

[[random_device]]

하드웨어의 특성을 결합해서 시드값을 만든다.

cpu 온도, cpu팬의 소음, mouse의 현재 위치 이런것들을 조합해서 시드값을 만들어내기 때문에 내가 어떤 시드값으로 난수를 생성했는지 절대 알 수 없다.

 

[[[사용해보자]]

난수 만들자

1. 난수 객체를 만들고 나서 객체의 functioncall operator를 호출하고 나면 랜덤 시드가 만들어진다.

2. 만들어진 랜덤 시드를 랜덤 엔진에 넣어서 랜덤한 난수를 만든다.

3. 시드에 따라서 다항식 계산이 다르게 되니까 랜덤한 시드를 넣어야 실행할 때 매다 매 번 다른값이 출력된다.

4. 못믿겠으면 시드를 넣지 말고 랜덤 엔진으로 난수를 만들어 보면 된다. 모든 컴퓨터에서 매번 동일한 값이 출력된다.

5. 아래와 같이 랜덤 엔진 초기화 할 때 바로 시드를 넣을 수 있다. 

1. 생성자를 호출해서 객체 생성

2. 함수 호출 연산자를 호출해서 랜덤 시드 리턴

3. 랜덤 엔진 초기화 하면서 시드 넣기

똑같은 괄호 두번 하는게 맘에 안들면 아래와 같이 균일 초기화로 가능

 

분포시키자

매번 다른 값이 올바르게 출력

 

분포를 할 때 char 타입이 없다는 것을 확인해 보자.

char 타입이 없다.

template이라서 인자를 보고 자동으로 char으로 추론하였다.

char 타입이 없기 때문에 오류가 난다.

해결방법

int타입으로 명시하고 나면 저장할 수 있다.

int 자료구조에 저장하면 아스키 코드가 저장되고 char자료구조에 저장하면 글자가 저장된다.

 

학습 장소: 한국공학대학교 게임공학과 수업

참고: https://en.cppreference.com/w/

'---C++ 역량 강화--- > STL 공부' 카테고리의 다른 글

partition, nth_element, partitial_sort, sort  (0) 2024.05.31
shuffle  (0) 2024.05.31
print, format  (0) 2024.05.31
iota  (0) 2024.05.31
sample  (0) 2024.05.31