이 문제에서는 주어진 확률을 기반으로 세 개의 숫자 중 하나를 생성하는 함수를 작성해야 합니다.
이를 위해 C++에서 기본으로 제공하는 난수 생성 함수 rand()를 활용합니다. 이 함수는 지정한 범위 내에서 모든 숫자가 동일한 확률로 나타나는 특징이 있습니다.
우리의 목표는 세 숫자 A, B, C를 각각 P(A), P(B), P(C)라는 확률로 반환하는 것입니다. 확률의 정의에 따라 다음 조건이 성립해야 합니다.
P(A) + P(B) + P(C) = 1
접근 방법
rand(a, b) 함수는 a부터 b까지의 어떤 숫자든 동일한 확률로 나타난다는 특성을 가지고 있습니다. 하지만 우리는 A가 확률 P(A)로, B가 확률 P(B)로 선택되기를 원합니다.
이를 해결하기 위해 각 확률을 백분율(%)로 변환하여 사용합니다. 예를 들어 P(A) = 1/5라면 이를 20%로 취급하는 방식입니다.
확률의 총합은 최대 100%이므로, 0부터 100 사이의 난수를 하나 생성하고, 그 값이 어느 구간에 속하는지에 따라 반환할 숫자를 결정합니다.
판정 조건
경우 1 − 생성된 난수가 0부터 P(A) 사이라면 A를 반환합니다.
경우 2 − 생성된 난수가 P(A)부터 P(A)+P(B) 사이라면 B를 반환합니다.
경우 3 − 생성된 난수가 P(A)+P(B)부터 100{P(A)+P(B)+P(C)} 사이라면 C를 반환합니다.
예제
A = 3 , P(A) = 35% B = 43, P(B) = 50% C = 90, P(C) = 15%
이 경우 프로그램은 다음과 같이 동작합니다.
- rand 함수가 0~35 사이의 숫자를 생성하면 → 3 반환
- rand 함수가 35~85 사이의 숫자를 생성하면 → 43 반환
- rand 함수가 85~100 사이의 숫자를 생성하면 → 90 반환
구현 코드
위 로직을 실제로 구현한 프로그램은 다음과 같습니다.
#include<iostream>
using namespace std;
int randomABC(int A, int B, int C, int PA, int PB, int PC){
int randNumber = rand()%100+1;
if (randNumber <= PA)
return A;
if (randNumber <= (PA+PB))
return B;
else
return C;
}
int main(){
cout<<"3, 45, 90 중 주어진 확률에 따라 선택된 숫자 : "<<randomABC(3, 43, 90, 35, 40, 25);
return 0;
}출력 결과
3, 45, 90 중 주어진 확률에 따라 선택된 숫자 : 3
이처럼 난수를 확률 구간에 매핑하는 방식을 사용하면, 원하는 확률 분포에 따라 특정 값을 선택하는 함수를 손쉽게 구현할 수 있습니다. 이 기법은 몬테카를로 시뮬레이션, 게임 내 아이템 드롭 확률 처리 등 다양한 분야에서 응용됩니다.