实现一个抽奖的逻辑:根据任务碎片权重获取一个碎片

场景:通过做任务随机生成一个任务碎片,并且通过其设置的权重计算产出的概率;

代码实现:

/**
 * 根据任务碎片权重获取一个碎片
 * @return MfxyTaskFragment
 * 说明:
 * 首先计算出待选奖品的总权重,这样做的目的是可以随意设置奖品权重,不必再考虑权重之和是否等于100。
 * 随机规则是首先生成一个随机数randomNumber(生成的随机数位于0到1的左开右闭区间),
 * 然后分别计算出当前奖品前前面所有有奖品(不包括当前奖品)的概率和d1和当前奖品后面(包括当前奖品)所有奖品的概率和d2,
 * 然后判断生成的随机数randomNumber是否已处于d1和d2之间,如果处于该区间之内则当前奖品将被抽中。
 */
public MfxyTaskFragment PercentageRandomFragment(List<MfxyTaskFragment> prizes) {
    int random = -2;
    try{
        double sumWeight = 0;
        //计算总权重
        for(MfxyTaskFragment rp_1 : prizes){
            sumWeight += rp_1.getWeight();
        }
        double randomNumber;
        randomNumber = Math.random();
        System.out.println("randomNumber是:" + randomNumber);
        double d1 = 0;
        double d2 = 0;

        for(int i=0;i<prizes.size();i++){
            d2 += Double.parseDouble(String.valueOf(prizes.get(i).getWeight()))/sumWeight;
            if(i==0){
                d1 = 0;
            }else{
                d1 +=Double.parseDouble(String.valueOf(prizes.get(i-1).getWeight()))/sumWeight;
            }
            if(randomNumber >= d1 && randomNumber <= d2){
                random = i;
                System.out.println("d1是:" + d1);
                System.out.println("d2是:" + d2);
                break;
            }
        }
    }catch(Exception e){
        System.out.println(e.getMessage());
        random = -1;
    }
    return prizes.get(random);
}

猜你喜欢

转载自blog.csdn.net/wangpei930228/article/details/114264915