抽奖活动不同概率实现

说道抽奖活动,首先肯定会想到Random的使用,在整数和小数之中取随机数需要注意的是nextInt()和nextDouble(),前者是有参函数,后者是无参函数(如下):

int random = new Random().nextInt(10);
double randomIndex = new Random().nextDouble();

前者表示从0-10之间取任意随机数;后者表示在0-1之间取任意小数,如果需要取得指定范围内小数,可进行如下操作:

double randomIndex = new Random().nextDouble()*0.05+0.2;
NumberFormat nf = NumberFormat.getPercentInstance();
//double n = Double.parseDouble(String.format("%.3f", randomIndex));//保留三位有效数字
nf.setMaximumFractionDigits(1);//1表示保存结果转化成百分比之后保存小数点后1位
String n = nf.format(randomIndex);//NumberFormat中的format方法将将结果转化为String类型输出(底层的实现)
System.out.println(n);

结果:
21.6%

表示在0.2-0.25之间取任意小数,同时使用NumberFormat类控制取得的数字到小数点后几位,也可按照上面代码保留几位小数输出。
顺带带大家看看list结合中指定范围内对象删除的两种方法(个人目前理解的两种,不代表只有两种):
1.遍历集合去进行删除
2.集合调用removeAll(xx)删除指定范围内的元素集合xx

ArrayList<Integer> xx = new ArrayList();
ArrayList<Integer> list = new ArrayList();
for (int i = 0; i < 10; i++){
     list.add(new Random().nextInt(10));
}
for (Integer ed: list){
     System.out.print(ed+" ");
}
System.out.println();
xx.add(1);
xx.add(2);
//第一种
for (int i = 0; i < list.size(); i++){//如果list使用foreach遍历会出现ConcurrentModificationException异常,具体可以自行搜索,本篇重点不在这
     for (Integer ac : xx){
          if (list.get(i) == ac){
               list.remove(list.get(i));
          }
     }
}
//第二种
list.removeAll(xx);
for (Integer ed: list){
      System.out.print(ed+" ");
}

结果大家可以感受一下。
那么最后来说我们抽奖环节的多用户不同概率的实现,先看代码:

ArrayList<Integer> list = new ArrayList();
ArrayList<Integer> ward = new ArrayList();//存放newList中得到的随机数
for (int i = 0; i < x; i++){
    list.add(1);
}
list.add(3);
list.add(6);
list.add(23);
list.add(234);
list.add(567);
list.add(876);
list.removeAll(ward);
for (Integer ed: list){
     System.out.print(ed + " ");
}
System.out.println();
//list深度拷贝
ArrayList<Integer> newList = new ArrayList();
newList.addAll(list);
for (int i = 0; i < n; i++){
    int randomIndex = new Random().nextInt(newList.size());//取newList中随机位置
    Integer randomItem = newList.get(randomIndex);//获取得到的位置的数字
    ward.add(randomItem);//得到的随机数存放到ward中
    newList.removeAll(ward);//newList中移除得到的所有数字
        for (Integer ed: newList){
            System.out.print(ed + " ");
        }
    System.out.println();
}
for (Integer ed: ward){
    System.out.print(ed + " ");
}

结果:
1 1 1 3 6 23 234 567 876 
3 6 23 234 567 876 
6 23 234 567 876 
6 23 567 876 
1 3 234 

按照每个数字不同中奖比率,某数字出现一次代表一次代表正常概率抽奖,当幸运值累计越多,中奖概率自然变高。
当随机获取list结合中的某一元素,无论该元素有多少重复数字,使用removeAll对所有该元素进行删除操作,然后再进行下一轮的随机取值,筛选出来的数字作为获奖者保存到另一集合中,以供最终结果展示。
希望可以为大家节省一些时间去和bug斗智斗勇!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值