前言
在最近的项目里面需要实现一个抽奖的功能,并且不同抽奖次数的中奖概率是不同的呢(都是套路啊!)
实施固定概率抽奖
原理
说到抽奖其实就是概率的问题,这是便想到了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;
}
}
} 
京公网安备 11010502036488号