ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C++] 랜덤 이벤트 (확률) 구현하기
    C++/미분류 2022. 10. 6. 17:51

    이번 글에서 다룰 랜덤 이벤트 라는 것은 게임에서 발생할 수 있는, 다음과 같은 상황을 의미합니다.

    N%의 확률로 발생하는 ~ (후략)

    동전 던지기, 트럼프 카드 뭉치에서 특정 카드를 뽑을 확률 등의 예시가 있을 수 있겠습니다.

    위와 같은 기능의 구현에, 다음과 같은 코드를 사용할 수 있습니다.

    #include <iostream>
    #include <ctime>
    #include <cstdlib>
    
    int main() {
        srand(time(NULL));
        int number = rand() % 100 + 1;
        if(number > 50)
            std::cout << "Head\n";
        else
            std::cout << "Tail\n";
        
        return 0;
    }

    위 구현은 C스타일의 코드입니다.

    난수를 생성하는 방법은 C++의 std 라이브러리에도, Boost에도 존재하는 등, 여러 방법을 사용할 수 있습니다.

     

    저는 위와 같은 코드의 구현 중, if문이 늘어날 수 있는 상황 (처리해야 할 확률 상황이 여러 개) 에 대하여 더 나은 구현이 없는지 검색을 하던 도중, 뜻밖의 배움을 얻었습니다.

    Program with probability (stackoverflow)

    위 글은, 위와 같은 코드의 구현이 적합한지에 관한 질문이었고, 그 답변 중 아래와 같은 답변이 있었습니다.

    This is not correct for sure as operator % makes your probability skewed because ~ (후략)

    %연산자가 난수 생성 함수의 확률을 왜곡한다는 내용이었습니다.

     

    C++은 std 라이브러리를 통해 균등 분포를 따르는 난수 생성을 지원합니다.

    #include <iostream>
    #include <random>
    
    int main() {
        std::random_device rd;
        std::mt19937 gen(rd());
        std::uniform_int_distribution<> distrib(0, 99);
        
        if(dist(gen) > 50)
            std::cout << "Head\n";
        else
            std::cout << "Tail\n";
        
        return 0;
    }

    위 코드는 C++스타일로 작성한 난수 생성 코드입니다.

     

    감사합니다.

    댓글

Designed by Tistory.