JAVA代码实现抽奖功能,自定义奖品以及奖品概率
大家好,我是梦辛工作室的灵,最近做了一个抽奖功能,然后自己为了以后方便和拓展 就封装了一下,可以自定义奖品 自定义权重 和 价格等信息,还可以自由设置是否每抽到一次 减少一个奖品,下面先来看下实现效果
package com.mx.getaward;
public class Main {
public static void main(String[] args) {
AwardGroup awardGroup = new AwardGroup();
awardGroup.setAutoReduce(true); // 是否每抽一次减少一个奖品
awardGroup.addAward(new Award("奖品1", 1, 10)); // Award 分别是 奖品名称 奖品权重(个数) 奖品价格
awardGroup.addAward(new Award("奖品2", 2, 10));
awardGroup.addAward(new Award("奖品3", 1, 10));
awardGroup.addAward(new Award("奖品4", 3, 10));
for (int i = 0; i < 7; i++) {
System.out.println(awardGroup.startGetAward());
}
}
}
下面是Award 类,里面就放了一些 奖品信息:
package com.mx.getaward;
public class Award {
public Award() {
}
public Award(String name, int weight, int money) {
this.name = name;
this.weight = weight;
this.money = money;
}
private String name; // 奖品名称
private int weight; // 奖品权重
private int money; // 奖品价值
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
public void reduceWeight(int reduce) {
if (weight - reduce < 0) {
weight = 0;
} else {
weight -= reduce;
}
}
@Override
public String toString() {
return "恭喜您获得奖品 " + name + " 价值 " + money + "元";
}
}
然后就是 奖品组类 AwardGroup
package com.mx.getaward;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class AwardGroup {
private List<Award> awardgroup;
private boolean isAutoReduce; // 是否自动减少数量
private int total = 0; // 总权数
public AwardGroup() {
awardgroup = new ArrayList<Award>();
}
public boolean addAward(Award award) {
total += award.getWeight();
return awardgroup.add(award);
}
public boolean remove(Award award) {
total -= award.getWeight();
return awardgroup.remove(award);
}
public List<Award> getAwardgroup() {
return awardgroup;
}
public void setAwardgroup(List<Award> awardgroup) {
this.awardgroup = awardgroup;
total = 0;
for (Award award : awardgroup) {
total += award.getWeight();
}
}
public boolean isAutoReduce() {
return isAutoReduce;
}
public void setAutoReduce(boolean isAutoReduce) {
this.isAutoReduce = isAutoReduce;
}
public synchronized Award startGetAward() {
if (awardgroup == null || total <= 0)
return null;
Random random = new Random();
int awardNUmber = random.nextInt(total);
for (Award award : awardgroup) {
if (awardNUmber + 1 - award.getWeight() > 0) {
awardNUmber -= award.getWeight();
continue;
}
if (isAutoReduce) {
award.reduceWeight(1);
total -= 1;
}
return award;
}
return null;
}
}
实现原理也很简单,比如现在有 3个奖品 ,权重分别为 10 20 30,那么总数就为 60,然后我们 从0-60抽一个随机数,依次减去每个奖品的现有权重,如果小于或等于0 那么就说明抽中的为该奖品