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());

}//模拟抽奖二十次【第二种方式调用】

for (int i = 0; i < 20; i++) {

RewardWrap rewardWrapRandom= (RewardWrap) weightRandom(new IWeightRandom() {

@Overridepublic ListapplyWraps() {returnrewardWraps;

}

@OverridepublicDefaultWeightWrap applyDefaultWrap() {returnrewardWrap;

}

});

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;

}public intgetRewardId() {returnrewardId;

}public void setRewardId(intrewardId) {this.rewardId =rewardId;

}public intgetRank() {returnrank;

}public void setRank(intrank) {this.rank =rank;

}

@OverridepublicString toString() {return "Reward{" +

"rewardId=" + rewardId +

", rewardName='" + rewardName + '\'' +

", rewardValue=" + rewardValue +

", rank=" + rank +

'}';

}

}/*** 方式1【创建对象调用的方式】

*

*@param*/

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 o = content.stream().filter(t -> { int result = r - t.getWeight();return result < 0; }).findFirst();returno.orElse(defaultResult);

}

}/*** 方式2【静态方法,内部实现接口方式的调用】

*

*@paramiWeightRandom

*@param

*@return

*/

public static T weightRandom(IWeightRandomiWeightRandom) {int s =iWeightRandom.applyWraps().stream().mapToInt(DefaultWeightWrap::getWeight).sum();int r =ThreadLocalRandom.current().nextInt(s);

Optional o = iWeightRandom.applyWraps().stream().filter(t -> { int result = r - t.getWeight();return result < 0; }).findFirst();returno.orElse(iWeightRandom.applyDefaultWrap());

}public interface IWeightRandom{

List applyWraps();//目标集合数据

T applyDefaultWrap();//默认返回值【参与奖励】

}//权重包装基类

public static abstract classDefaultWeightWrap {public int weight;//权重

public intgetWeight() {returnweight;

}

@OverridepublicString toString() {return "DefaultWeightWrap{" +

"weight=" + weight +

'}';

}

}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值