통합검색
· 마을서비스란?  · 포럼마을  · 일반마을  · 테마마을  · 마을랭킹  · 활동왕
· 덱스퍼트란?  · TECBOX   · PRSBOX   · 이용안내  
· DEXT제품군  · 솔루션베이  · S/W & ESD 컴포넌트
· 프로그램베이
· LiveSeminar  · LiveConference
Visual C++ 포럼마을 입니다.
  마을등급 Visual C++   이 마을은 포럼마을 입니다이 마을은 자유가입제 마을 입니다 마을소개 페이지로 이동 전입신청
마을촌장촌장 나성훈 주민 34036 since 2006-12-29
우리마을 공지사항
질문&답변
강좌&팁
자유게시판
자료실
앨범
개인게시판
마을 게시판
등록된 마을 게시판이
없습니다.
랑데브 게시판
칼럼 게시판
개발자 고충상담
Dev Talk
자유토론방
벼룩시장
재나미 우스개
구인/프로젝트 정보
사람인 채용 게시판
  고객지원 게시판
마이 데브피아
 나의 e-Money 내역
 활동왕 My Page
 스크랩한 게시글보기
 쪽지관리
 주소록관리

 강좌&팁
 [C++] 한줄 완성! 쉽고 직관적인 mt19937 난수 생성기 (Random 클래스)  | VC++ 일반 2018-03-30 오전 11:32:31
 kilojuliet  kilojuliet님께 메시지 보내기kilojuliet님을 내 주소록에 추가합니다.kilojuliet님의 개인게시판 가기 번호: 8876 추천:0  / 읽음:2,177

C++11 기본 난수 엔진 mt19937

 

예전에 mt19937 난수 엔진을 소개하는 포스팅을 올린 적이 있습니다(지난 포스팅 - 랜덤 함수, 이제는 바꿔보자!! mt19937)개인적으로도 난수 발생 코드 작성 시 mt19937 엔진을 이용하고 있는데, 실제 난수 발생을 위한 generator 객체를 만들기까지 과정이 다소 귀찮게 느껴집니다. mt19937 난수 엔진을 이용한 일반적인 난수 발생 코드는 다음과 같습니다.

 

#include <random>
#include <ctime>
#include <iostream>
#include <functional>

using namespace std;

int main()
{
    mt19937 engine((unsigned int)time(NULL));                    // MT19937 난수 엔진
    uniform_int_distribution<int> distribution(0, 100);          // 생성 범위
    auto generator = bind(distribution, engine);


    // 0~100 범위의 난수 100개 생성하여 출력
    for (int i = 0; i < 100; ++i)
        cout << generator() << endl;
} 

 

 

별거 아닌 코드지만 반복해서 작성하다보면 점점 귀찮아지고, distribution 객체와 engine 객체를 bind 하여 generator 객체를 생성하는 것도 익숙하지 않다보니 자꾸 이전 코드를 찾아보게 됩니다. 그래서 '쉽고 직관적으로 mt19937 난수를 생성해주는 도구를 만들어보자' 라는 생각으로 Random 클래스를 만들어 보았습니다.

 

 

Random 클래스 개요

 

Random 클래슨는 생성할 난수 타입을 템플릿 파라미터로 받는 템플릿 클래스입니다. 템플릿 파라미터 타입은 반드시 int, double 등과 같은 Arithmetic Type 이어야 합니다. 이외의 타입이 전달되었을 경우에는 컴파일 오류가 발생하도록 되어있습니다. 

 

template <typename Type>
class Random
{
public:
    static_assert(std::is_arithmetic<Type>::value"Template argument data must be a arithmetic type");
    ...
};

 

 

정수 타입 난수 생성

 

이제 Random 클래스 객체를 만들어 실제 난수를 생성해보겠습니다. int 타입의 난수를 생성하고 싶다면 Random<int> 타입의 generator 객체를 선언하고 생성자 파라미터에 원하는 난수 범위를 전달하면 됩니다. 만약 난수 범위 파라미터를 생략하면 해당 타입의 min ~ max 범위의 난수를 생성합니다.

 

Random<intgen(-10001000);
auto num = gen();

 

 

Random 클래스는 8byte 정수 타입인 __int64, unsigned __int64 타입의 난수 역시 생성할 수 있습니다.

 

Random<__int64gen(0100000000000);
auto num = gen();

 

 

부동소수 타입 난수 생성

 

이번엔 부동소수 double 타입의 난수를 생성해보도록 하죠. 위에서 작성한 코드에서 int 타입을 double 타입으로 바꿔주고 난수 범위만 전달하면 끝입니다. 다음 코드는 0.0 ~ 1.0 사이의 double 타입 난수를 생성하는 코드입니다.

 

Random<doublegen(0.01.0);
auto num = gen();
 

 

사용자 시드 값 주기

 

지금까지 작성한 난수 생성 코드는 시드 값을 랜덤하게 부여하여 실행할 때마다 다른 난수를 생성하도록 되어있습니다. 하지만 때로는 시드값을 일정한 값으로 부여하여 난수를 생성하고 싶은 경우도 있을 수 있습니다. 이 때에는 Random 클래스 생성자의 세번째 파라미터에 사용자 시드값을 전달하면 됩니다.

 

unsigned int seed = 42;
Random<intgen(-10001000seed);
auto num = gen();

 

 

지금까지 Random 클래스의 사용 방법을 살펴보았습니다. 워낙 간단한 코드라서 별로 설명할 것이 없네요. 개선해야 할 사항이 있다면 언제든지 알려주시기 바랍니다. 마지막으로 Random 클래스의 소스 파일은 첨부 파일로 올려두었으니 다운로드하여 사용하시기 바랍니다.

 

 

Reference

 

[C++] 랜덤 함수, 이제는 바꿔보자!! mt19937

 

 

원문 링크

 

코멘트쓰기
  좋음   놀람   궁금   화남   슬픔   최고   침묵   시무룩   부끄럼   난감
* 코멘트는 500자 이내(띄어쓰기 포함)로 적어주세요.
목록 보기   지금 보고 계시는 글을 회원님의 my Mblog >> 스크랩에 넣어두고 다음에 바로 보실 수 있습니다.  
회사소개  |   개인정보취급방침  |  제휴문의  |   광고문의  |   E-Mail 무단수집거부  |   고객지원  |   이용안내  |   세금계산서
사업자등록번호 안내: 220-81-90008 / 통신판매업신고번호 제 2017-서울구로-0055호 / 대표: 홍영준, 서민호
08390, 서울시 구로구 디지털로32길 30, 1211호 / TEL. 02_6719_6200 / FAX. 02-6499-1910
Copyright ⓒ (주) 데브피아. All rights reserved.