JAVA实现抽奖功能,自定义奖品以及奖品概率

发布于 2020-07-17 09:25:07
package com.mx.getaward;
public class Main {

        public static void main(String[] args) {
                AwardGroup awardGroup = new AwardGroup();
                awardGroup.setAutoReduce(true); // 是否每抽一次减少一个奖品
                // Award 分别是 奖品名称 奖品权重(个数) 奖品价格
                awardGroup.addAward(new Award("奖品1", 1, 10)); 
                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 那么就说明抽中的为该奖品

0 条评论

发布
问题