1、创建权重实体类
package com.qr.gameServer100.entity;
import lombok.Data;
/**
* @author lianJiaYu
* @date 2021/7/26 14:43
*/
@Data
public class PrizeDto {
private String id;//id
private double prize_weight;//权重
}
2、main方法进行测试
import com.qr.gameServer100.entity.PrizeDto;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;
/**
* @author lianJiaYu
* @date 2021/8/6 17:42
*/
public class Test3 {
/**
* main方法测试
* @param args
*/
public static void main(String[] args){
List<PrizeDto> list = new ArrayList<>();
PrizeDto prizeDto1 = new PrizeDto();
prizeDto1.setId("苹果11");
prizeDto1.setPrize_weight(0.01);
PrizeDto prizeDto2 = new PrizeDto();
prizeDto2.setId("谢谢惠顾");
prizeDto2.setPrize_weight(99.9);
list.add(prizeDto1);
list.add(prizeDto2);
//System.out.println(list);
//这里我测试循环100次来进行测试
for (int i = 0; i < 100; i++) {
int prizeIndex = getPrizeIndex(list);
PrizeDto prizeDto = list.get(prizeIndex);
System.out.println(prizeDto);
}
}
/**
* 根据Math.random()产生一个double型的随机数,判断每个奖品出现的概率
*
* @param prizes
* @return random:奖品列表prizes中的序列(prizes中的第random个就是抽中的奖品)
*/
public static int getPrizeIndex(List<PrizeDto> prizes) {
//DecimalFormat df = new DecimalFormat("######0.00");
int random = -1;
try {
//计算总权重
double sumWeight = 0;
for (PrizeDto p : prizes) {
sumWeight += p.getPrize_weight();
}
//产生随机数
double randomNumber;
randomNumber = Math.random();
//根据随机数在所有奖品分布的区域并确定所抽奖品
double d1 = 0;
double d2 = 0;
for (int i = 0; i < prizes.size(); i++) {
d2 += Double.parseDouble(String.valueOf(prizes.get(i).getPrize_weight())) / sumWeight;
if (i == 0) {
d1 = 0;
} else {
d1 += Double.parseDouble(String.valueOf(prizes.get(i - 1).getPrize_weight())) / sumWeight;
}
if (randomNumber >= d1 && randomNumber <= d2) {
random = i;
break;
}
}
} catch (Exception e) {
System.out.println("生成抽奖随机数出错,出错原因:" + e.getMessage());
}
return random;
}
}
3、运行结果