|
|
package class_2023_05_3_week;
|
|
|
|
|
|
// 来自学员问题
|
|
|
// 假设每一次获得随机数的时候,这个数字大于100的概率是P
|
|
|
// 尝试N次,其中大于100的次数在A次~B次之间的概率是多少?
|
|
|
// 0 < P < 1, P是double类型
|
|
|
// 1 <= A <= B <= N <= 100
|
|
|
public class Code02_More100TimesBetweenAB {
|
|
|
|
|
|
public static double probability(double P, int N, int A, int B) {
|
|
|
double[][] dp = new double[N + 1][N + 1];
|
|
|
for (int i = 0; i <= N; i++) {
|
|
|
for (int j = 0; j <= N; j++) {
|
|
|
dp[i][j] = -1;
|
|
|
}
|
|
|
}
|
|
|
double ans = 0;
|
|
|
for (int j = A; j <= B; j++) {
|
|
|
ans += process(P, 1D - P, N, j, dp);
|
|
|
}
|
|
|
return ans;
|
|
|
}
|
|
|
|
|
|
// 获得随机数大于100的概率是more
|
|
|
// 获得随机数小于等于100的概率是less
|
|
|
// 还有i次需要去扔
|
|
|
// 扔出大于100的次数必须是j次
|
|
|
// 返回概率
|
|
|
public static double process(double more, double less, int i, int j, double[][] dp) {
|
|
|
if (i < 0 || j < 0 || i < j) {
|
|
|
return 0D;
|
|
|
}
|
|
|
// i >= 0 & j >= 0 & i >= j
|
|
|
if (i == 0 && j == 0) {
|
|
|
return 1D;
|
|
|
}
|
|
|
// i < 0
|
|
|
// i == 0 j > 0
|
|
|
// i == 0 j < 0
|
|
|
// i == 0 j == 0
|
|
|
// 如果是上面四种情况,都提前返回了
|
|
|
// i > 0 & i >= j
|
|
|
if (dp[i][j] != -1) {
|
|
|
return dp[i][j];
|
|
|
}
|
|
|
// 1) > 100 情况,more * (i - 1, j - 1)
|
|
|
// 2) <= 100 情况 , less * (i - 1, j)
|
|
|
// 总体达成的概率 = 1) + 2)
|
|
|
double ans = more * process(more, less, i - 1, j - 1, dp) + less * process(more, less, i - 1, j, dp);
|
|
|
dp[i][j] = ans;
|
|
|
return ans;
|
|
|
}
|
|
|
|
|
|
public static void main(String[] args) {
|
|
|
double P = 0.6;
|
|
|
int N = 100;
|
|
|
int A = 30;
|
|
|
int B = 50;
|
|
|
System.out.println(probability(P, N, A, B));
|
|
|
}
|
|
|
|
|
|
}
|