实体类

package com.teenway;import lombok.Data;import java.math.BigDecimal;/*** @version 1.0* @date 2022/11/16 15:53*/
@Data
public class Raffle {private String prizeName;private BigDecimal probability;
}

工具类

package com.teenway;import cn.hutool.core.util.RandomUtil;import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;/*** @author * @version 1.0* @date 2022/11/16 16:14*/
public class RaffleUtil {public static void main(String[] args) throws Exception {List<Raffle> raffleList = new ArrayList<>();Raffle raffle1 = new Raffle();Raffle raffle2 = new Raffle();Raffle raffle3 = new Raffle();Raffle raffle4 = new Raffle();Raffle raffle5 = new Raffle();raffle1.setPrizeName("奖品1");raffle1.setProbability(new BigDecimal("60.00"));raffle2.setPrizeName("奖品2");raffle2.setProbability(new BigDecimal("19.69"));raffle3.setPrizeName("奖品3");raffle3.setProbability(new BigDecimal("5.00"));raffle4.setPrizeName("奖品4");raffle4.setProbability(new BigDecimal("5.00"));raffle5.setPrizeName("奖品5");raffle5.setProbability(new BigDecimal("10.31"));raffleList.add(raffle1);raffleList.add(raffle2);raffleList.add(raffle3);raffleList.add(raffle4);raffleList.add(raffle5);int count0=0;int count1=0;int count2=0;int count3=0;int count4=0;for (int i = 0; i <100000 ; i++) {int b = getPrize(raffleList);if(b==0){count0++;}else if(b==1){count1++;}else if(b==2){count2++;}else if(b==3){count3++;}else if(b==4){count4++;}}System.out.println("抽奖100000次,抽中奖品1的次数为"+count0);System.out.println("抽奖100000次,抽中奖品2的次数为"+count1);System.out.println("抽奖100000次,抽中奖品3的次数为"+count2);System.out.println("抽奖100000次,抽中奖品4的次数为"+count3);System.out.println("抽奖100000次,抽中奖品5的次数为"+count4);}public static int getPrize(List<Raffle> raffleList) throws Exception {
//        int rand = (int)(Math.random()*10000);int rand = RandomUtil.randomInt(1,10000);System.out.println(rand);BigDecimal decimal = new BigDecimal(0);for (int i = 0; i <raffleList.size() ; i++) {decimal = decimal.add(raffleList.get(i).getProbability());}
//        System.out.println(decimal);if(!decimal.equals(new BigDecimal("100.00"))){throw new Exception("奖品概率之和不等于1");}int range = 0;for (int i = 0; i <raffleList.size() ; i++) {int start = range+1;int end = raffleList.get(i).getProbability().multiply(new BigDecimal(100)).intValue()+range;range += raffleList.get(i).getProbability().multiply(new BigDecimal(100)).intValue();
//            System.out.println(raffleList.get(i).getPrizeName()+": "+start+"~"+end);if(start<= rand && rand<=end){
//                System.out.println("抽中奖品:"+raffleList.get(i).getPrizeName());return i;}}return 0;}
}
抽奖100000次,抽中奖品1的次数为60098
抽奖100000次,抽中奖品2的次数为19679
抽奖100000次,抽中奖品3的次数为4939
抽奖100000次,抽中奖品4的次数为5027
抽奖100000次,抽中奖品5的次数为10257

两种获取随机数方法的比较

    public static void main(String[] args){List<Integer> list1 = new ArrayList<>();List<Integer> list2 = new ArrayList<>();for (int i = 0; i <100 ; i++) {list1.add(RandomUtil.randomInt(0, 100));list2.add((int)(Math.random()*100));}Map<Integer, Long> collect1 = list1.stream().collect(Collectors.groupingBy(Integer::intValue, Collectors.counting()));Map<Integer, Long> collect2 = list2.stream().collect(Collectors.groupingBy(Integer::intValue, Collectors.counting()));System.out.println(collect1);System.out.println(collect2);}

输出结果

{0=2, 2=1, 3=2, 4=1, 5=1, 6=1, 7=2, 10=1, 13=2, 14=1, 15=1, 16=2, 17=2, 18=1, 19=2, 21=1, 23=3, 24=1, 26=1, 27=2, 29=1, 30=2, 31=2, 36=2, 37=1, 38=2, 40=2, 42=2, 43=1, 49=1, 54=2, 55=1, 57=1, 58=1, 60=2, 62=1, 64=2, 65=3, 66=2, 67=1, 68=2, 70=1, 74=3, 75=1, 77=4, 78=1, 79=1, 80=3, 81=5, 83=1, 84=1, 85=3, 86=1, 88=1, 89=1, 90=2, 91=2, 92=1, 95=1, 98=2, 99=1}
{0=1, 3=3, 6=1, 7=2, 9=2, 10=1, 11=1, 12=2, 13=2, 14=1, 16=1, 17=1, 18=3, 20=1, 21=1, 22=1, 23=1, 24=2, 26=2, 29=2, 31=3, 32=1, 33=2, 36=3, 37=2, 38=1, 39=2, 40=1, 41=1, 44=1, 46=1, 49=1, 51=1, 54=3, 55=3, 56=2, 58=1, 61=1, 62=1, 63=1, 65=1, 67=3, 68=3, 69=2, 71=1, 72=2, 74=2, 75=2, 78=3, 79=1, 80=1, 81=1, 82=1, 83=2, 84=1, 86=1, 89=1, 92=1, 95=1, 97=1, 98=3, 99=3}