[CPP-01] 랜덤값 얻기

이대현·2021년 4월 20일
0

C / CPP

목록 보기
15/28

[CPP-Module / ex02: Plucking some brains 과제]

1. Zombie class를 만들어라

  • type, name
  • announce()
    • <name (type)> 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 랜덤 수 생성하기

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

- 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;
}

2. 메르센 트위스터 난수 생성기

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;
}
profile
삽질의 기록들 👨‍💻

0개의 댓글