利用binarySearch实现抽奖计算逻辑

前言

我们平时抽奖总感觉想抽到最高的奖那么难,哈哈当然不会那么容易啦,正巧写了个抽奖的功能,趁着有时间把抽奖的功能实现整理一下,我们要抽奖首先要定义一个奖品的实体类,这个实体类中包含奖品的基本信息,比如奖品名称,奖品数量,抽奖权值,是否是奖品(因为要考虑到谢谢惠顾之类的未中奖情况)等等,根据需求的扩增也可以对每个人抽中奖的次数进行限制(增加抽奖次数属性),在此不做过于复杂的设计,主要说实现的逻辑。定义实体类后我们就去装填奖品信息了(去数据库增加中奖信息...),我们也可以不使用数据库只做一些模拟数据,以上都准备好后就可以开始我们的抽奖逻辑设计了。

抽奖逻辑

我们通过定义奖品信息的权值来作为后续控制中奖几率的关键,权值为整数类型,数值越小被抽中的几率越小,我们把真正的奖品设置的权值小一些,将不中奖的权值设置的大一些,然后我们将权值作为map数组的value放入map数组中,key为奖品的具体对象信息(一个奖品的对象信息对应着它的权值)。我们根据它们的权值来新建一个专门用来抽奖的数组,这个数组必须满足1.是有序的2.与奖品数组的下标一一对应。最简单粗暴的方式就是让所有的权值递加变成一个递增的新数组。生成这个数组后我们就可以利用binarySearch函数实现根据随机数来拿取具体的奖品对象了,实现了由奖品权值来定义抽奖的中奖率。

逻辑功能实现

下面用一段逻辑代码来描述中奖奖品产生的关键过程。在这里补充一下binarySearch函数的运用,binarySearch(Object[], Object key)函数中第一个参数是要搜索的数组,参数key为要搜索的值

情况 结果
值不是数组元素,且在数组范围内 得到-(插入点索引值《后面讲到》+1)
值是数组元素 得到搜索的索引值
值不是数组元素,且大于数组内元素 -(length+1)
值不是数组元素,且小于数组内元素 -1

插入的索引值其实就是将当前的搜索值放入搜索数值后,得到的这个值的下一位值的索引值,打个比方,搜索数组为:【12,13,20,90】搜索值为【60】那么将搜索值放入搜索数组后得到【12,13,20,60,90】那么这时的90的索引值4即为插入点索引值,试想当搜索值不在该数组范围内且小于数组范围时,此时的插入点应该是数组的第一个值,该插入点的索引值也就是1,反之大于数组范围时插入点的索引值为(length+1)。

public class GetIndex {
	private int weightAdder ; //权值加法器基数
	private int index ; //权值加法器填充时下标
	private int dex;  //中奖值下标
	private int max;  //最大权值
	private int random;
	private Random ran;
	private ArrayList record = new ArrayList();
	private int[] weights; //权值加法器数组
	public static DecimalFormat df = new DecimalFormat("0.00"); //格式化数值
	public static int[] map = new int[] {10,8450,1000,500,40}; //中奖权值 
	public static int looptime = 100;//抽奖次数
	public static void main(String[] args) {
	  GetIndex getindex = new GetIndex();
	  
	  for (int j = 0;j

贴上逻辑运算结果 :
利用binarySearch实现抽奖计算逻辑_第1张图片

你可能感兴趣的:(利用binarySearch实现抽奖计算逻辑)