Java编程二项分布的递归和非递归实现攻略
什么是二项分布?
二项分布是离散分布中的一种,描述了在n次独立重复进行相同的随机实验中,恰好出现k次成功的概率。在很多领域中得到广泛的应用,例如统计学、质量控制、信号处理等等。
二项分布是由n和p两个参数所决定,其中n表示实验的次数,p表示每次实验成功的概率。用数学公式表示为:
$$ P(X = k) = \binom{n}{k} p^k (1-p)^{n-k} $$
其中,$ \binom{n}{k} $ 表示在n次实验中,取出k个成功的组合数。
递归实现二项分布
二项分布的递归实现方法需要用到数学中的杨辉三角,即二项式系数的组合数数组,可以通过递归函数的方式计算。
代码实现如下:
public static double binomial(int n, int k, double p) {
if (n == 0 && k == 0) return 1.0;
if (n < 0 || k < 0) return 0.0;
return (1 - p) * binomial(n-1, k, p) + p * binomial(n-1, k-1, p);
}
其中,n、k、p分别为二项分布的三个参数,函数的返回值为概率值。
非递归实现二项分布
递归实现方法虽然简单易懂,但递归过程中会导致重复计算,影响程序效率,因此还可以采用非递归实现方法。
使用非递归方法,可以利用之前求解的结果,节省计算时间,提高效率。具体实现如下:
public static double binomial(int n, int k, double p) {
double[][] dp = new double[n + 1][k + 1];
dp[0][0] = 1.0;
for (int i = 1; i <= n; i++) {
dp[i][0] = (1 - p) * dp[i-1][0];
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= k; j++) {
dp[i][j] = (1 - p) * dp[i-1][j] + p * dp[i-1][j-1];
}
}
return dp[n][k];
}
函数的返回值与递归实现方法一样,都是概率值。
示例说明
示例一
在一次考试中,一个学生有75%的概率回答正确,如果这次考试共有10道题目,求该学生能够回答出6道题目的概率。
double p = 0.75;
int n = 10;
int k = 6;
System.out.println("递归实现概率值:" + binomial(n, k, p));
System.out.println("非递归实现概率值:" + binomial(n, k, p));
输出:
递归实现概率值:0.2128400803803018
非递归实现概率值:0.21284008038030179
示例二
在一批物料中,有10%的物料存在缺陷,要求从该批物料中取出20个,求取出5个有缺陷的物料的概率。
double p = 0.1;
int n = 20;
int k = 5;
System.out.println("递归实现概率值:" + binomial(n, k, p));
System.out.println("非递归实现概率值:" + binomial(n, k, p));
输出:
递归实现概率值:0.026424561178150988
非递归实现概率值:0.026424561178150997
以上两个示例都使用了递归和非递归两种实现方式,并且结果完全一致。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java编程二项分布的递归和非递归实现代码实例 - Python技术站