더북(TheBook)

코드만 봐도 이해가 될 것이다. 계산대에서 기다리는 Customer 객체를 위한 queue 컨테이너가 유일하게 있는 멤버다. add() 멤버는 큐에 신규 고객을 추가한다. 큐에서는 첫 번째 원소만 처리할 수 있다. 1분이 지날 때마다 Checkout 객체의 time_increment() 멤버가 호출된다. 이 멤버는 첫 번째 Customer 객체의 time_decrement() 멤버를 호출해서 남은 대기 시간을 감소시키고 done() 멤버를 호출한다. Customer 객체의 done()true를 반환하면 고객은 계산을 마친 것이므로 큐(대기열)에서 제거된다. Checkout 객체의 비교 연산자는 큐 길이를 비교한다.

시뮬레이션을 하려면 무작위 숫자 발생 기능이 필요하다. 여기서는 random 헤더에서 매우 간단한 기능만 사용할 것이고, 자세한 설명은 생략할 것이다. random 헤더에서 제공하는 기능에 대해서는 이 책 뒤에서 자세히 다룬다. 이 프로그램은 uniform_int_distribution<> 타입의 인스턴스를 사용할 것이다. 타입 이름이 의미하는 것처럼 최솟값과 최댓값 사이에 균등하게 분포된 정수를 생성하는 균등분포를 정의한다. 균등분포에서 범위 안에 있는 값들은 모두 균등하게 분포된다. 다음 문장은 10과 100 사이에 균등분포를 정의한다.

std::uniform_int_distribution<> d {10, 100};

이 문장은 분포 객체 d를 정의한다. d는 범위에 값이 어떻게 분포될지를 지정한다. 범위에서 무작위 숫자를 얻으려면 d에 함수 호출 연산자로 전달할 무작위 숫자 엔진(random number engine)이 필요하다. 무작위 숫자 엔진은 무작위 정수를 반환한다. random 헤더에는 무작위 숫자 엔진이 여러 개 정의되어 있다. 여기서는 가장 간단한 것을 사용하자. 다음과 같이 정의하면 된다.

std::random_device random_number_engine;

범위로 지정한 무작위 값이 d로 정의한 분포에 따라 생성되게 하려면 다음과 같이 작성하면 된다.

auto value = d(random_number_engine); // d의 operator()()를 호출한다

value에 저장된 값은 d로 정의한 분포를 따르는 정수가 된다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.