Java中怎么实现一个按比抽奖功能

这篇文章给大家介绍Java中怎么实现一个按比抽奖功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

创新互联建站专注于网站建设、成都网站制作、网页设计、网站制作、网站开发。公司秉持“客户至上,用心服务”的宗旨,从客户的利益和观点出发,让客户在网络营销中找到自己的驻足之地。尊重和关怀每一位客户,用严谨的态度对待客户,用专业的服务创造价值,成为客户值得信赖的朋友,为客户解除后顾之忧。

一.概述

使用离散算法即根据奖品占比进行分段,然后再产生随机数匹配所对应的区间。首先定义Prize奖品实体类,类中有prizeName(奖品名称)、prizeWeight(奖品比重)、prizeCount(奖品数量)属性,下面是核心的代码:

/**   * 按比例随机抽取一项   * @param list 奖品列表   * @return 类型值   */  public static String ratioExtract(List list) {    //非空判断    if (list==null || list.size()<1) {      return null;    }    //占比之和    double sum=0.00;    //分段数组(20,30,60)    double[] subArray=new double[list.size()+1];    //将概率分段    for (int i = 0; i < list.size(); i++) {      subArray[i]=sum;      //这里除要考虑奖品所占比重外还要将奖品数量计算分段其中      sum+=list.get(i).getPrizeWeight()*list.get(i).getPrizeCount();    }    //加上取最大的值    subArray[subArray.length-1]=sum;    /* 产生随机数 */    Random random=new Random();    double rand = random.nextDouble()*sum;    //返回字符    String field=null;    for (int i = 0; i < subArray.length; i++) {      if (i==subArray.length-1) {        return field;      }      if (rand>=subArray[i] && rand

二、测试

以下是完整的抽奖工具类

import lombok.Data;import org.apache.commons.lang.math.RandomUtils;import java.util.List;import java.util.Random;/** * @Description: 抽奖工具类 * @author: xiake * @Date: 2020/1/5 13:23 * @ModifiedDate:2020/1/5 13:23 * @Copyright: miaoxaike.com */public class PrizeMathRandom {  /**   * 按比例随机抽取一项   * @param fieldArray 类型值数组   * @param proportions 与类型值对应 的占比值   * @return 类型值   */  public static String ratioExtract(String[] fieldArray,double[] proportions) {    //判断两个数组长度是否相等    if(fieldArray.length!=proportions.length) {      return "两数组长度不相等,无法执行";    }    //占比之和    double sum=0.00;    //分段数组(20,30,60)    double[] subArray=new double[proportions.length+1];    //将概率分段    for (int i = 0; i < proportions.length; i++) {      subArray[i]=sum;      sum+=proportions[i];    }    //加上取最大的值    subArray[subArray.length-1]=sum;    Random random=new Random();    /* 产生随机数 区间为 (0,sum)*/    double rand = random.nextDouble()*sum;    //返回字符    String field=null;    for (int i = 0; i < subArray.length; i++) {      if (rand>=subArray[i] && rand list) {    //非空判断    if (list==null || list.size()<1) {      return null;    }    //占比之和    double sum=0.00;    //分段数组(20,30,60)    double[] subArray=new double[list.size()+1];    //将概率分段    for (int i = 0; i < list.size(); i++) {      subArray[i]=sum;      sum+=list.get(i).getPrizeWeight()*list.get(i).getPrizeCount();    }    //加上取最大的值    subArray[subArray.length-1]=sum;    /* 产生随机数 */    Random random=new Random();    double rand = random.nextDouble()*sum;    //返回字符    String field=null;    for (int i = 0; i < subArray.length; i++) {      if (i==subArray.length-1) {        return field;      }      if (rand>=subArray[i] && rand

除了核心的实现方法外另外还补充了两个扩充的方法为满足游戏规则所用。下面简单做个测试

public static void main(String[] args) {    //初始化奖品信息    List prizeList=new ArrayList<>();    prizeList.add(new Prize("一等奖",1,1));    prizeList.add(new Prize("二等奖",3,4));    prizeList.add(new Prize("三等奖",6,5));    for (int i = 0; i < 12; i++) {      Prize prize = ratioExtract(prizeList);      if (prize!=null){        System.out.println("第"+(i+1)+"次,抽中 "+prize.getPrizeName()+" 剩余奖品数量="+prize.getPrizeCount());      }else {        System.out.println("第"+(i+1)+"次,奖品已抽完");      }    }  }

关于Java中怎么实现一个按比抽奖功能就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。


当前文章:Java中怎么实现一个按比抽奖功能
当前网址:http://pwwzsj.com/article/ppdcoo.html