前言

在最近的项目里面需要实现一个抽奖的功能,并且不同抽奖次数的中奖概率是不同的呢(都是套路啊!)

实施固定概率抽奖

原理

说到抽奖其实就是概率的问题,这是便想到了Math.random()这个函数,它可以为我们产生一个Double类型的数字, 伪随机数在范围[0,1),也就是说,从0(包括0)往上,但是不包括1(排除1)。

假如A奖品的中奖概率为0.4,B奖品概率为0.5,未中奖的概率是0.1,那么我们先产生一个随机数,然后判断它的大小,若在[0, 0.4)即中A奖品,在[0.4, 0.8)则中B奖品,[0.9, 1)之间不中奖。因为随机数出现大小的的位置随机的,那么我们便可以这样来设置数值区间来判断抽中的是哪一个奖品。

编写代码

public class Random {

// 以上边的概率为例子,用一维数组来存储概率信息。
private double[] probability =  {0.4, 0.4, 0.1};

    public static int init() {
        double randomNumber = Math.random();
        // 生成随机数然后去比对位于哪一个区间
        if (randomNumber <= probability[0]) {
            return 0;
        }
        if (randomNumber <= probability[0] + probability[1]){
            return 1;
        } else {
            return 2;
        }
    }
}

实施不同次数概率抽奖

我们经常会看到,在一些抽奖活动中呢,你抽的次数越多,中奖的概率就越高,这个时候就需要用一个二维数组来存储中奖概率的信息了。

假设: A中奖概率 B中奖概率 未中奖

第一次: 0.4 0.4 0.1

第二次 0.45 0.45 0

public class Random {

    // time 第几次抽奖 这里从0开始的,需要注意
    private static double[][] probability = {
            {0.4,  0.4,  0.1},
            {0.45, 0.45, 0  },
    };
    public static int init(int time) {
        double randomNumber = Math.random();
        if (randomNumber <= probability[time][0]) {
            return 0;
        }
        if (randomNumber <= probability[time][0] + probability[time][1]) {
            return 1;
        } else {
            return 2;
        }
    }
}