河南循中网络科技有限公司 - 精心创作,详细分解,按照步骤,均可成功!
代码
实体类
package 包路径;
import lombok.Data;
@Data
public class Prize {
//奖品id
private Integer id;
//奖品名称
private String name;
//中奖几率
private Double probability;
}
方法类
package 包路径;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class PrizeUtil {
public static void main(String[] args) {
List<Prize> prizeList = new ArrayList<>();
//奖品一
Prize prize = new Prize();
prize.setId(1);
prize.setName("手机");
prize.setProbability(30D);
prizeList.add(prize);
//奖品二
Prize prize1 = new Prize();
prize1.setId(2);
prize1.setName("电脑");
prize1.setProbability(70D);
prizeList.add(prize1);
//抽奖
System.out.println(lottery(prizeList));
}
/**
* 抽奖
* @param prizeList 奖品列表
* @return 中奖对象
*/
public static Prize lottery(List<Prize> prizeList) {
if(prizeList.isEmpty()){
throw new RuntimeException();
}
//总数
int size = prizeList.size();
//计算总概率
double sumProbability = 0d;
for (Prize prize : prizeList) {
sumProbability += prize.getProbability();
}
//计算每个奖品的概率区间
//例如奖品A概率区间0-0.1 奖品B概率区间 0.1-0.5 奖品C概率区间0.5-1
//每个奖品的中奖率越大,所占的概率区间就越大
List<Double> sortAwardProbabilityList = new ArrayList<Double>(size);
Double tempSumProbability = 0d;
for (Prize prize : prizeList) {
tempSumProbability += prize.getProbability();
sortAwardProbabilityList.add(tempSumProbability / sumProbability);
}
//产生0-1之间的随机数
//随机数在哪个概率区间内,则是哪个奖品
double randomDouble = Math.random();
//加入到概率区间中,排序后,返回的下标则是list中,中奖的下标
sortAwardProbabilityList.add(randomDouble);
Collections.sort(sortAwardProbabilityList);
int lotteryIndex = sortAwardProbabilityList.indexOf(randomDouble);
return prizeList.get(lotteryIndex);
}
}
代码解读
计算步骤
计算list总条数
计算总概率
计算每个奖品的概率区间
产生0-1之间的随机数
加入到概率区间中,排序后,返回的下标则是list中,中奖的下标
因为是0-1的随机数,而奖品计算的区间最多也就是1,略微大于中奖随机数的区间则就是中奖奖品的下标,进行排序后则可以取到下标值