Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 주사위를 N번 던질 때의 최대 점 수


M개의 면을 가진 주사위를 N번 던진 후 예상할 수 있는 최대 점 수를 계산하는 작업이 주어집니다.

주사위의 첫 번째 면에는 1개의 점이 있고 두 번째 면에는 2개의 점이 있는 식입니다. 마찬가지로 M번째 면에는 M개의 점이 포함됩니다.

각 얼굴의 출현 확률은 1/M이 됩니다.

이제 예제를 사용하여 무엇을 해야 하는지 이해합시다 -

입력 - M=2, N=3

출력 − 1.875

설명 − 주사위의 면이 2개 ={1, 2}

주사위를 3번 던지면 샘플 공간은 =M N 이 됩니다. =2 3

{(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2,)
(2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2,)}
Maximum number in (1, 1, 1) = 1
Maximum number in (1, 1, 2) = 2
Maximum number in (1, 2, 1) = 2
Maximum number in (1, 2, 2) = 2
Maximum number in (2, 1, 1) = 2
Maximum number in (2, 1, 2) = 2
Maximum number in (2, 2, 1) = 2
Maximum number in (2, 2, 2) = 2
Probability of each case = 1/23 = 0.125
Therefore, expectation of maximum number = (1+2+2+2+2+2+2+2) * (0.125) = 1.875

입력 - M=2, N=2

출력 − 1.75

아래 프로그램에서 사용하는 접근 방식은 다음과 같습니다.

  • 숫자가 발생할 수 있는 최대 경우 수는 공식을 사용하여 이전 숫자를 사용하여 찾을 수 있습니다. - i N – (i-1) N .

    예를 들어 M=4이고 N=2인 경우 최대값이 4인 총 케이스 수는 4 2 가 됩니다. – (4-1) 2 =7.

    따라서 최종 답은 1에서 M −

    까지의 모든 요소에 이 공식을 적용하는 것입니다.

    (i * (i N – (i - 1) N )) / M N 그리고 그것들을 더합니다.

  • MaxExpect() 함수에서 double 유형의 변수 max =0을 초기화하여 합계를 저장합니다.

  • 그런 다음 i=M에서 i>0

    까지 루프
  • 루프 내에서 위에서 언급한 공식을 적용하고 모든 결과 값을 최대 변수에 계속 추가합니다.

예시

#include <bits/stdc++.h>
using namespace std;
double MaxExpect(double M, double N){
   double max = 0.0, i;
   for (i = M; i; i--)
      /*formula to find maximum number and
      sum of maximum numbers*/
      max += (pow(i / M, N) - pow((i - 1) / M, N)) * i;
      return max;
}
int main(){
   double M = 2, N = 3;
   cout << MaxExpect(M, N);
   return 0;
}

출력

위의 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다 -

1.875