java 打乱排序 抽奖_Java实现按照权重随机抽奖案例

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值