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

C++로 두 개의 주사위를 N번 던졌을 때 특정 합이 나올 확률 구하기

두 개의 주사위 쌍을 N번 던졌을 때, 원하는 합(sum)이 나올 확률을 계산하는 것이 이 글의 목표입니다. 입력으로는 목표 합계와 주사위를 던지는 횟수 N이 주어지며, 프로그램은 해당 합계가 나올 확률을 출력합니다.

확률이란 주어진 데이터 집합에서 우리가 원하는 결과가 나올 가능성을 의미합니다. 확률의 범위는 항상 0과 1 사이이며, 0은 해당 사건이 절대 일어나지 않음(불가능)을, 1은 반드시 일어남(확실성)을 나타냅니다.

예제

입력: sum = 12, N = 1
출력: Probability = 1/36
설명: 두 개의 주사위를 한 번 던졌을 때 나올 수 있는 조합은 다음과 같습니다.
(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (2, 1), (2, 2), (2, 3), (2, 4),
(2, 5), (2, 6), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5), (3, 6), (4, 1), (4, 2),
(4, 3), (4, 4), (4, 5), (4, 6), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5), (5, 6),
(6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (6, 6).
이 조합들 중에서 합이 12가 되는 경우는 (6, 6) 하나뿐이므로 확률은 1/36이 됩니다.

입력: sum = 4, N = 6
출력: probability is : 1/2985984

접근 방법

이 문제를 해결하기 위한 접근 방식은 다음과 같습니다.

  • 목표 합계(sum)와 주사위를 던지는 횟수(N)를 입력받습니다.
  • 두 개의 주사위를 N번 던졌을 때 특정 합이 나올 확률은 다음 공식으로 계산합니다: (유리한 경우의 수 / 전체 경우의 수)^N
  • 먼저 두 개의 주사위를 한 번 던졌을 때 해당 합이 나올 확률(Probability1)을 구합니다.
  • 그런 다음 N번 던졌을 때의 확률(Probability2)은 다음과 같이 계산됩니다.
  • Probability2 = (Probability1)^N, 즉 Probability1을 N제곱한 값입니다.

알고리즘

Start
Step 1-> 확률을 계산하는 함수 선언
    int probability(int sum, int times)
    float res = 0.0 과 total = 36.0 선언 및 초기화
    long int probab = 0 선언
    Loop For i = 1 and i <= 6 and i++
        Loop For j = 1 and j <= 6 and j++
            IF ((i + j) == sum)
                res++
            End
        End
    End
    int gcd1 = __gcd((int)res, (int)total)
    res = res / (float)gcd1
    total = total / (float)gcd1
    probab = pow(total, times)
    return probab
Step 2-> main() 함수에서
    int sum = 4 와 times = 6 선언 및 초기화
    probability(sum, times) 호출
Stop

예제 코드

#include <bits/stdc++.h>
using namespace std;
// 두 개의 주사위를 N번 던졌을 때 특정 합이 나올 확률을 계산하는 함수
int probability(int sum, int times) {
    float res = 0.0, total = 36.0;
    long int probab = 0;
    for (int i = 1; i <= 6; i++) {
        for (int j = 1; j <= 6; j++) {
            if ((i + j) == sum)
            res++;
        }
    }
    int gcd1 = __gcd((int)res, (int)total);
    res = res / (float)gcd1;
    total = total / (float)gcd1;
    probab = pow(total, times);
    return probab;
}
int main() {
    int sum = 4, times = 6;
    cout<<"probability is : ";
    cout << "1" << "/" << probability(sum, times);
    return 0;
}

출력 결과

probability is : 1/2985984

코드의 동작 원리를 살펴보면, 먼저 중첩 반복문을 통해 두 주사위 눈의 모든 조합(총 36가지)을 확인하면서 목표 합과 일치하는 경우의 수를 셉니다. 그 후 최대공약수(GCD)를 이용해 분수를 기약분수 형태로 약분하고, 전체 경우의 수를 N제곱하여 분모 값을 얻습니다. 최종적으로 '1/분모' 형태로 확률을 출력합니다.