본문으로 바로가기

 3. 스타크래프트를 만들자 ② (씹어먹는 C++)

 

생성자의 초기화 리스트_initializer list

// 기존의 생성자
Marine::Marine() {
  hp = 50;
  coord_x = coord_y = 0;
  damage = 5;
  is_dead = false;
}

// 초기화 리스트 생성자
Marine::Marine() 
	: hp(50), coord_x(0), coord_y(0), damage(5), is_dead(false) {}

 초기화 리스트를 왜 사용해야 하냐면, 초기화 리스트를 사용한 버전의 경우 생성과 초기화를 동시에 하기 때문이다. 초기화 리스트를 사용하지 않는 것은 생성을 먼저 하고 그 다음에 대입 을 수행한다. 그러므로, 생성과 동시에 초기화 되어야 하는 const 상수레퍼런스 들을 초기화 할 때는 초기화 리스트를 써야한다. 또한, 더 효율적이고 속도가 빠르다.


Static 변수

1

C++ 의 난수 생성

#include <iostream>
#include <random>

int main() {
  // 시드값을 얻기 위한 random_device 생성.
  std::random_device rd;

  // random_device 를 통해 난수 생성 엔진을 초기화 한다.
  std::mt19937 gen(rd());

  // 0 부터 99 까지 균등하게 나타나는 난수열을 생성하기 위해 균등 분포 정의.
  std::uniform_int_distribution<int> dis(0, 99);

  for (int i = 0; i < 5; i++) {
    std::cout << "난수 : " << dis(gen) << std::endl;
  }
}

C 의 경우에서는 time(NULL) 을 통해서 시드값을 지정하였지만 문제점이 많았기에 C++ 에서는 양질의 시드값을 제공하기 위해 random_device 를 제공한다. 이것은 진짜 난수 를 제공해준다. 하지만, C에서의 의사 난수보다 난수의 생성 속도가 매우 느리기 때문에 시드값처럼 난수 엔진을 초기화 하는데만 사용하고, 그 이후의 난수열은 난수 엔진으로 생성하는 것이 적합하다.

 std::mt19937 에 우리가 생성했던 random_device 로 난수를 집어넣어준다. std::mt19937 은 난수 생성 엔진 중 하나로, 메르센 트위스터 라는 알고리즘을 사용하며, rand 보다 양질의 난수열을 생성한다.

이렇게 난수 생성 엔진 (std::mt19937) 을 만들었지만, 분포를 정의해주어야 한다. 0부터 99까지 균등한 확률로 정수를 뽑아내고 싶다면 위 코드와 같이 uniform_int_distribuition<int> dis(0,99) 를 해주면 된다.

마지막으로, 분포에 사용할 난수 엔진을 전달함으로써 균등 분포에서 무작위로 샘플을 뽑아낸다. 균등 분포와는 다른 정규 분포도 있다. (분포 전체 목록)

5. 

 

6. 

 

 


.3

1. 

 

2. 

 

3. 

 

4. 

 

5. 

 

6. 

 

반응형