温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么在Java中使用binarySearch编写一个抽奖算法

发布时间:2020-12-23 16:52:24 来源:亿速云 阅读:179 作者:Leah 栏目:开发技术

这期内容当中小编将会给大家带来有关怎么在Java中使用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<String> record = new ArrayList<String>();
	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<looptime;j++) {
		getindex.index = 0;
		getindex.weightAdder = 0;
		getindex.ran = new Random();
		getindex.weights = new int[map.length];
		//生成权限加法器数组,保证新生成数据值有序递增
		for(int w : map ) {
			getindex.weights[getindex.index++] = (getindex.weightAdder = getindex.weightAdder + w);
			
		}
		/*
		 * for(int w : weights) { System.out.println("数组:"+w); }
		 */
		getindex.max = getindex.weights[getindex.weights.length-1]; //获取权限加法器数组最大值
		getindex.random = getindex.ran.nextInt(getindex.max)+1; //生成随机数
		getindex.dex = Arrays.binarySearch(getindex.weights, getindex.random);//重要:获取该数组的一个下标即为中奖值
		System.out.println("随机数:"+getindex.random);
		System.out.println("Dex: "+getindex.dex);
		//计算dex时数组被加1,所以在此减一
		if(getindex.dex < 0) {
			getindex.dex = -1 - getindex.dex;
		}
		System.out.println("Result: "+getindex.dex+" 加法器数组数据:"+getindex.weights[getindex.dex]+" 选中号:"+map[getindex.dex]);
		if(getindex.dex == 4 || getindex.dex == 0 || getindex.dex == 3) { //假设第一位与第五位中奖
			getindex.record.add("中奖号:"+map[getindex.dex]);
		}
	 }
	  for(String rec: getindex.record) {
		  System.out.println(rec );
	  }
	  String odds = df.format((float)getindex.record.size()/map.length);
	  System.out.println("中奖率: "+ odds );
	 
	}
}
以上是抽奖过程中的主要逻辑,其核心就是利用binarySearch函数在随机搜索值中找到一个搜索数组的一个下标,根据该下标定位到具体的奖品信息。

贴上逻辑运算结果 :

怎么在Java中使用binarySearch编写一个抽奖算法

上述就是小编为大家分享的怎么在Java中使用binarySearch编写一个抽奖算法了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI