-
[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++스타일로 작성한 난수 생성 코드입니다.
감사합니다.
'C++ > 미분류' 카테고리의 다른 글
[Direct2D] 도형 그려보기 (0) 2024.02.08 [Win32] Windows application 만들기 (1) 2024.01.25 [Visual Studio] Code style 변경하기 (BSD, K&R) (0) 2022.09.14 [WinAPI] Edit Control에서 Enter키 입력 받기 (0) 2022.06.22 [Visual Studio] LNK2019, LNK1120 (0) 2022.06.13