在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