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