importjava.util.ArrayList;importjava.util.List;importjava.util.Optional;importjava.util.concurrent.ThreadLocalRandom;/***
*@author:linxu
* @Date:2020-7-24 00:09:54*/
public classWeightRandomTemplate {public static voidmain(String[] args) {
List rewardWraps = new ArrayList<>();
rewardWraps.add(new RewardWrap(12881,"一等奖",1,1, 10));
rewardWraps.add(new RewardWrap(12882,"二等奖",1,2, 30));
rewardWraps.add(new RewardWrap(12883,"三等奖",1,3, 50));//默认奖励,如果抽不到奖,默认抽中安慰奖【参与奖】
RewardWrap rewardWrap =new RewardWrap(12884,"安慰奖",1,4, 60);
rewardWraps.add(rewardWrap);
WeightRandom weightRandom = new WeightRandom<>(rewardWraps, rewardWrap);//模拟抽奖二十次
for (int i = 0; i < 20; i++) {
RewardWrap rewardWrapRandom=(RewardWrap) weightRandom.randomWeightWrap();
System.out.println(rewardWrapRandom.toString());
}
}//测试实现类
public static class RewardWrap extendsDefaultWeightWrap {private int rewardId;//奖励id
private String rewardName;//奖励名称
private int rewardValue;//数量
private int rank;//奖励排名1等奖,2等奖
public RewardWrap(int rewardId, String rewardName, int rewardValue, int rank,intweight) {this.rewardName =rewardName;this.rewardValue =rewardValue;this.rewardId =rewardId;this.rank =rank;this.weight=weight;
}
@OverridepublicString toString() {return "Reward{" +
"rewardId=" + rewardId +
", rewardName=‘" + rewardName + ‘\‘‘ +
", rewardValue=" + rewardValue +
", rank=" + rank +
‘}‘;
}
}public static class WeightRandom{private List content;//目标集合数据
private T defaultResult;//默认返回值【参与奖励】
public WeightRandom(Listcontent, T defaultResult) {this.content =content;this.defaultResult =defaultResult;
}publicT randomWeightWrap() {int s =content.stream().mapToInt(DefaultWeightWrap::getWeight).sum();int r =ThreadLocalRandom.current().nextInt(s);
Optional optional = content.stream().filter(t -> { int result = r - t.getWeight();return result < 0; }).findFirst();returnoptional.orElse(defaultResult);
}
}//权重包装基类
public static abstract classDefaultWeightWrap {public int weight;//权重
public intgetWeight() {returnweight;
}
}
}
测试结果:
Reward{rewardId=12884, rewardName=‘安慰奖‘, rewardValue=1, rank=4}
Reward{rewardId=12882, rewardName=‘二等奖‘, rewardValue=1, rank=2}
Reward{rewardId=12884, rewardName=‘安慰奖‘, rewardValue=1, rank=4}
Reward{rewardId=12881, rewardName=‘一等奖‘, rewardValue=1, rank=1}
Reward{rewardId=12884, rewardName=‘安慰奖‘, rewardValue=1, rank=4}
Reward{rewardId=12883, rewardName=‘三等奖‘, rewardValue=1, rank=3}
Reward{rewardId=12884, rewardName=‘安慰奖‘, rewardValue=1, rank=4}
Reward{rewardId=12884, rewardName=‘安慰奖‘, rewardValue=1, rank=4}
Reward{rewardId=12884, rewardName=‘安慰奖‘, rewardValue=1, rank=4}
Reward{rewardId=12884, rewardName=‘安慰奖‘, rewardValue=1, rank=4}
Reward{rewardId=12884, rewardName=‘安慰奖‘, rewardValue=1, rank=4}
Reward{rewardId=12881, rewardName=‘一等奖‘, rewardValue=1, rank=1}
Reward{rewardId=12884, rewardName=‘安慰奖‘, rewardValue=1, rank=4}
Reward{rewardId=12882, rewardName=‘二等奖‘, rewardValue=1, rank=2}
Reward{rewardId=12884, rewardName=‘安慰奖‘, rewardValue=1, rank=4}
Reward{rewardId=12883, rewardName=‘三等奖‘, rewardValue=1, rank=3}
Reward{rewardId=12884, rewardName=‘安慰奖‘, rewardValue=1, rank=4}
Reward{rewardId=12883, rewardName=‘三等奖‘, rewardValue=1, rank=3}
Reward{rewardId=12884, rewardName=‘安慰奖‘, rewardValue=1, rank=4}
Reward{rewardId=12884, rewardName=‘安慰奖‘, rewardValue=1, rank=4}
Process finished with exit code0