参考文章
/**
* 积分夺宝开奖算法
* @param userDrawList 夺宝用户list
* @param targetPersonTimes 总中奖人次
* @param drawInfo 抽奖信息记录(记录抽奖详情)
*/
private List<UserDrawDTO> drawPrize(List<UserDrawDTO> userDrawList, Integer targetPersonTimes, Map<String,Object> drawInfo){
//中奖人list
List<UserDrawDTO> winnerList = Collections.EMPTY_LIST;
Random random = new Random();
//总抽奖次数
Integer totalTimes = 0;
//从大到小排序
userDrawList = userDrawList.stream().sorted(((o1, o2) -> {
if (o1.getTimes() > o2.getTimes()) {
return -1;
}
if (o1.getTimes() < o2.getTimes()) {
return 1;
}
return 0;
})).collect(Collectors.toList());
for (int i = 0; i < targetPersonTimes; i++) {
//中奖号码
int drawNum = random.nextInt(totalTimes) + 1;
for (int j = 0; j < userDrawList.size(); j++) {
Integer currentTimes = userDrawList.get(j).getTimes();
if (currentTimes >= drawNum) {
//中奖人
winnerList.add(userDrawList.get(j));
// System.out.println("获奖人:" + userDrawList.get(j) + ", drawNum: " + drawNum);
//总抽奖次数减去此次中奖人的参加次数
totalTimes -= currentTimes;
userDrawList.remove(j);
break;
}
//如果当前用户未中奖,减去当前用户的参与次数,与下一位进行对比,一直减小到 >=下一位的参与次数
drawNum -= currentTimes;
}
}
drawInfo.put("totalTimes", totalTimes);
return winnerList;
}
@AllArgsConstructor
@Data
public class UserDraw {
static int count = 0;
//用户id
int userId;
//抽奖次数
int times;
public static void main(String[] args) {
// for (int j = 0; j < 10; j++){
// Random random = new Random();
// System.out.println(random.nextInt(10) + 1);
// }
// System.out.println(count/10);
choujiang();
}
public static void choujiang(){
Random random = new Random();
//总抽奖人次
Integer totalTimes = 0;
//模拟数据
List<UserDraw> userDrawList = new ArrayList<>();
for (int i = 1; i < 10; i++) {
int times = random.nextInt(1000) + 1;
UserDraw userDraw = new UserDraw(i, times);
totalTimes += times;
userDrawList.add(userDraw);
}
//排序
userDrawList = userDrawList.stream().sorted(((o1, o2) -> {
if (o1.getTimes() > o2.getTimes()) {
return -1;
}
if (o1.getTimes() < o2.getTimes()) {
return 1;
}
return 0;
})).collect(Collectors.toList());
System.out.println("算法前积分总和:" + totalTimes);
userDrawList.stream().forEach(e -> {
// System.out.println(e.toString());
});
//中奖人数
int drawTotal = 10;
List<Integer> list = new ArrayList<>();
for (int i = 0; i < drawTotal; i++) {
int index = 0;
//中奖号码
int drawNum = random.nextInt(totalTimes) + 1;
list.add(drawNum);
for (int j = index; j < userDrawList.size(); j++) {
// System.out.println("对比的数据:" + userDrawList.get(j).getTimes() + ">= " + drawNum);
if (userDrawList.get(j).getTimes() >= drawNum) {
if (userDrawList.get(j).getUserId() == 2){
count ++;
}
//中奖人
System.out.println("获奖人:" + userDrawList.get(j) + ", drawNum: " + drawNum);
totalTimes -= userDrawList.get(j).getTimes();
userDrawList.remove(j);
break;
}
drawNum -= userDrawList.get(j).getTimes();
}
}
}
}