该回答引用GPTᴼᴾᴱᴺᴬᴵ
抽卡出货概率可以通过每个品质的概率乘以抽卡次数来计算。例如,抽一次稀有品质的概率是40%,抽十次的概率是40%的十次方,即0.4^10,约等于0.0001。
对于有保底的情况,可以先计算没有保底时的概率,然后再减去没有抽中保底情况的概率,得到最终的概率。例如,10连抽中至少有一个精英或史诗品质,可以计算没有保底时10连抽中没有精英或史诗品质的概率,即(1-0.1-0.005)的十次方,约等于0.394。然后,用1减去这个概率,得到有保底情况下10连抽中至少有一个精英或史诗品质的概率,即1-0.394=0.606。
根据以上计算方法,可以编写如下Java代码实现:
import java.util.Random;
public class CardGame {
private static final double[] PROBABILITY = {0.495, 0.4, 0.1, 0.005};
private static final int QUALITY_NUM = PROBABILITY.length;
public static int[] getTenGeneral() {
int[] result = new int[10];
Random rand = new Random();
// 抽10次
for (int i = 0; i < 10; i++) {
double p = rand.nextDouble(); // 生成0~1的随机数
int quality = 1;
double probSum = 0;
// 确定品质
for (int j = 0; j < QUALITY_NUM; j++) {
probSum += PROBABILITY[j];
if (p < probSum) {
quality = j + 1;
break;
}
}
result[i] = quality;
}
// 判断是否有保底
boolean hasEpicOrElite = false;
for (int q : result) {
if (q == 3 || q == 4) {
hasEpicOrElite = true;
break;
}
}
// 如果没有保底,重新抽取
if (!hasEpicOrElite) {
return getTenGeneral();
}
return result;
}
}
在上面的代码中,PROBABILITY数组存储了每个品质的概率,QUALITY_NUM变量表示品质的数量。在getTenGeneral方法中,首先抽取10次武将,每次根据概率随机生成品质,并将品质存入结果数组中。然后,检查结果数组中是否有精英或史诗品质,如果没有则重新抽取,直到有保底。最终返回结果数组。