C++/미분류
[C++] 랜덤 이벤트 (확률) 구현하기
ruru14
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++스타일로 작성한 난수 생성 코드입니다.
감사합니다.