一、根据概率进行抽奖
参考:
java 抽奖概率逻辑实现(超简单,hutool很准)
java抽奖概率抽奖
java实现根据概率中奖率怎么算
1.概率实现抽奖原理
定义一个奖品池 如下:
Map<String, Integer> probabilityMap = new HashMap<>();
probabilityMap.put("一等奖", 10); // 10%的概率
probabilityMap.put("二等奖", 20); // 20%的概率
probabilityMap.put("三等奖", 30); // 30%的概率
probabilityMap.put("四等奖", 40); // 40%的概率
把奖品池中的概率相加(注意:总的概率之和不能大于100),然后使用java.util.Random的nextInt(int bound)获取一个随机数:
Random random = new Random();
int intRandom=random.nextInt(100);//100表示概率之后
或cn.hutool.core.util.RandomUtil中的randomInt(final int limitExclude)获取一个随机数:
int randomNum = RandomUtil.randomInt(100);//100表示概率之后
得到随机数之后循环奖品池,循环到第一个满足条件(随机数<=奖品池的概率/累加概率值)的奖品返回,在循环之前设置一个概率之和参数,初始值为0,在循环中累加概率值。
2.代码实现
import cn.hutool.core.util.RandomUtil;
import java.util.HashMap;
import java.util.Map;
public class ProbabilityLottery {
public static <T> T lotteryByProbability(Map<T, Integer> probabilityMap) {
int sum = probabilityMap.values().stream().mapToInt(Integer::intValue).sum();//获取概率之和
int randomNum = RandomUtil.randomInt(sum);//获取随机数
int currentSum = 0;//累加概率值
for (Map.Entry<T, Integer> entry : probabilityMap.entrySet()) {
currentSum += entry.getValue();
if (randomNum <= currentSum) {
return entry.getKey();
}
}
// 应该不会执行到这里,除非传入的概率总和不是100%
return null;
}
public static void main(String[] args) {
Map<String, Integer> probabilityMap = new HashMap<>();
probabilityMap.put("一等奖", 10); // 10%的概率
probabilityMap.put("二等奖", 20); // 20%的概率
probabilityMap.put("三等奖", 30); // 30%的概率
probabilityMap.put("四等奖", 40); // 40%的概率
String result = lotteryByProbability(probabilityMap);
System.out.println("抽奖结果:" + result);
}
}
二、随机抽奖
package com.dcqq.wechat;
import cn.hutool.core.util.RandomUtil;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ProbabilityLottery {
public static void main(String[] args) {
List<String> list=new ArrayList<>();
list.add("一等奖");
list.add("二等奖");
list.add("三等奖");
list.add("四等奖");
int randomNum = RandomUtil.randomInt(list.size()-1);//获取随机数
System.out.println(list.get(randomNum));
}
}