---
description: >-
  진짜 '랜덤'한 수를 얻으려면 seed에 매번 다른 숫자를 넣어 srand함수로 rand함수를 초기화 해줘야 한다. 이때 매번 다른 수를
  어떻게 넣어줄 수 있을까?
---

# \[CPP-01] 랜덤값 얻기

**\[CPP-Module / ex02: Plucking some brains 과제]** 1. `Zombie` class를 만들어라

* `type`, `name`
* `announce()`
  * &#x20;Braiiiiiiinnnssss... 를 출력

2.`ZombieEvent` class를 만들어라

* `void setZombieType(const std::string type)`;
  * type 객체에 값 저장
* `Zombie *newZombie(const std::string name) const`;
  * 동적할당으로 새로운 Zombie 클래스 만든 후 반환
* `void randomChump(void) const`;
  * 무작위로 name을 정한 좀비를 만들고 announce
  * 정적할당으로 좀비 생성

### 고민한 지점

1. 랜덤한 name을 어떻게 생성할지

## 1. CPP 랜덤 수 생성하기

아래 세 개의 함수가 필요하다.

```cpp
- 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** 범위의 랜덤값을 얻고 싶다면 아래와 같이 프로그램을 작성하면 된다.

```cpp
#include <time.h>
#include <iostream>

int main(void)
{
  srand(time(NULL));
    int random = rand() % n
}
```
