抽卡出货概率怎么算,有保底?
功能设计题1-抽卡活动
游戏中通过抽卡获取武将,每次抽卡是⼀次独⽴随机事件,抽到的武将品质符合以下表中的概率:
品质 描述 概率
1 普通 49.5%
2 稀有 40%
3 精英 10%
4 史诗 0.5%
接下来是激动⼈⼼的10连抽时间,策划同学对此提出额外需求:
⼗连抽中⾄少有1个是精英或者史诗品质;
史诗品质武将的总体出货概率保持0.5%不变。第⼀个需求:
请你实现以下接⼝: int[] getTenGeneral(),该接⼝返回⼗连抽所得到的武将品质的数组。提示:可以直接使⽤random()⽅法返回⼀个double类型的[0,1)范围内的随机数。
第⼆个需求:
策划同学还想知道在你的实现⽅式下,精英品质武将在十连抽中的总体出货概率⼤致变成多少?注:提供算法伪代码或者思路均可。
文档:功能设计题1-抽卡活动.note
链接:http://note.youdao.com/noteshare?id=f5cbbcb88d92c9e2caa466d1319a0425
该回答引用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次武将,每次根据概率随机生成品质,并将品质存入结果数组中。然后,检查结果数组中是否有精英或史诗品质,如果没有则重新抽取,直到有保底。最终返回结果数组。