[CPP-Module / ex02: Plucking some brains 과제]
1. Zombie
class를 만들어라
type
, name
announce()
2. ZombieEvent
class를 만들어라
void setZombieType(const std::string type)
;Zombie *newZombie(const std::string name) const
;void randomChump(void) const
;아래 세 개의 함수가 필요하다.
- int rand (void)
- void srand (unsigned int seed);
- time_t time (time_t* timer);
rand
함수는 0 ~ RAND_MAX(32767) 까지의 랜덤한 수를 반환한다. 하지만 프로그램이 생성될 때 딱 한번 값이 정해지기 때문에 프로그램을 여러 번 실행시켜도 동일한 값이 나온다.
srand
함수는 rand 함수에 사용되는 어떤 내부적인 수를 초기화해준다. 인자로 받은 seed를 통해서 그 값에 매치되는 어떤 수로 리셋하는데, seed가 같으면 같은 수로 초기화 되는 문제가 있다. 따라서 진짜 '랜덤'한 수를 얻으려면 seed에 매번 다른 숫자를 넣어 srand함수로 rand함수를 초기화 해줘야 한다. 왜캐 복잡해.
매번 다른 수를 어떻게 넣어줄 수 있을까? 이때 time 함수를 사용한다.
time
함수는 UCT 기준 1970년 1월 1일 0시 0분 0초 부터 경과된 시간을 초(sec)로 반환한다. 즉, time
함수를 통해 항상 변화하는 수를 얻고, 그 수를 srand의 seed로 넣어주면 된다!
따라서 0 ~ n-1 범위의 랜덤값을 얻고 싶다면 아래와 같이 프로그램을 작성하면 된다.
#include <time.h>
#include <iostream>
int main(void)
{
srand(time(NULL));
int random = rand() % n;
}
c++11 이후 사용 가능한 난수 엔진 MT19937
을 활용한 주사위 코드
#include <iostream>
#include <random>
using namespace std;
int main(void)
{
random_device rd; //seed
mt19937 gen(rd()); //난수 객체 생성
uniform_int_distribution<int> distrib(1, 6); //균등 분포
for (int i = 0; i < 10; i++)
cout << distrib(gen) << ' ';
return 0;
}