在C ++中的N次投掷硬币中至少获得K头的可能性

概率是从可用数据集中获得所需输出的机会。概率范围在0和1之间,其中整数0表示不可能的可能性,而整数1表示确定性。

什么是概率?

数学的概率为我们提供了表明事件和原因的不确定性的工具。换句话说,可以说概率用于计算给定事件发生的可能性,该可能性可以表示为1到0之间的数字。例如:当无偏硬币被掷出时获得正面的概率,或者得到3当掷骰子时。

现在,回到问题上,我们必须找到在N次抛硬币中至少获得k个头的可能性。

就像我们有3个硬币,k为2,所以有23 = 8种抛硬币的方法是-

HHH,HTH,HHT,HTT,THH,THT,TTT,TTH。

并且至少包含2个head的集合是-

HHH,HTH,HHT,THH。

因此,概率将是4/8或0.5。

示例

Input: k = 1, n = 3
Output: 0.875

Input: k = 3, n = 6
Output: 0.65625

我们将遵循的解决上述问题的方法-

  • 我们将n和k作为输入。

  • 将阶乘的值存储在数组中,并在需要时调用它。

  • 执行计算。

  • 返回结果。

算法

Step 1-> declare function to calculate the probability of getting at least k heads in n tosses
   double probability(int k, int n)
   Declare and set double check = 0
   Loop For i = k and i <= n and ++i
      Set check += temp[n] / (temp[i] * temp[n - i])
   End
   Call check = check / (1LL << n)
   return check
Step 2-> declare function to precompute the value
   void precompute()   Set temp[0] = temp[1] = 1
   Loop For i = 2 and i < 20 and ++i
      Set temp[i] = temp[i - 1] * i
Step 3-> In main
   Call precompute()   Call probability(1, 3)
Stop

示例

#include<bits/stdc++.h>
using namespace std;
#define size 21
double temp[size];
//计算n次掷出至少k个头的概率。
double probability(int k, int n) {
   double check = 0;
   for (int i = k; i <= n; ++i)
   check += temp[n] / (temp[i] * temp[n - i]);
   check = check / (1LL << n);
   return check;
}
void precompute() {
   temp[0] = temp[1] = 1;
   for (int i = 2; i < 20; ++i)
   temp[i] = temp[i - 1] * i;
}
int main() {
   precompute();
   //从3个硬币中获得1头像的可能性
   cout<<"probability is : "<<probability(1, 3) << "\n";
   //从6枚硬币中获得3枚的概率
   cout<<"probability is : "<<probability(3, 6) <<"\n";
   return 0;
}

输出结果

probability is : 0.875
probability is : 0.65625