Jonathan Star 2023-03-02 09:45 采纳率: 77.5%
浏览 59
已结题

抽卡出货概率怎么算,有保底?

抽卡出货概率怎么算,有保底?
功能设计题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

  • 写回答

1条回答 默认 最新

  • MarkHan_ 2023-03-02 12:55
    关注

    该回答引用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次武将,每次根据概率随机生成品质,并将品质存入结果数组中。然后,检查结果数组中是否有精英或史诗品质,如果没有则重新抽取,直到有保底。最终返回结果数组。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月11日
  • 已采纳回答 3月3日
  • 创建了问题 3月2日

悬赏问题

  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)