Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 주어진 확률에 따라 3개의 숫자 중 하나를 생성하는 함수 만들기

이 문제에서는 주어진 확률을 기반으로 세 개의 숫자 중 하나를 생성하는 함수를 작성해야 합니다.

이를 위해 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

이처럼 난수를 확률 구간에 매핑하는 방식을 사용하면, 원하는 확률 분포에 따라 특정 값을 선택하는 함수를 손쉽게 구현할 수 있습니다. 이 기법은 몬테카를로 시뮬레이션, 게임 내 아이템 드롭 확률 처리 등 다양한 분야에서 응용됩니다.