需求
目前
客户点击签到按钮获取固定的积分值。
预期
- 客户点击签到按钮进行一次锦鲤抽奖,抽到的用户获得188积分。未抽到的则还是获取固定的积分值。
- 锦鲤签到有一定的数量限制,比例是昨日签到人数的5%。
算法和实现
public class Test {
// 昨日签到总人数
static int count = 1000;
// 今日锦鲤最大的数量
static int luckyCount = 3;
// 设置奖励
static Map<String, Integer> awardStockMap = new ConcurrentHashMap<>(8);
static {
awardStockMap.put("Lucky", luckyCount);
awardStockMap.put("Normal", count - luckyCount);
}
public static int luckyUser() {
// 生成一个随机数
int randNum = new Random().nextInt(count);
int prev = 0;
String choosedAward = null;
// 按照权重计算中奖区间
for (Map.Entry<String, Integer> e : awardStockMap.entrySet()) {
if (randNum >= prev && randNum < prev + e.getValue()) {
// 落入该奖品区间
choosedAward = e.getKey();
break;
}
prev = prev + e.getValue();
}
if ("Lucky".equals(choosedAward)) {
System.out.println("获取锦鲤积分" + awardStockMap.get("Lucky"));
int c = awardStockMap.get("Lucky")-1;
awardStockMap.put("Lucky", c);
if (c == 0) {
return c;
}
return c;
}
return 99;
}
public static void main(String[] args) {
for (int i = 0; i < 500; i++) {
if (luckyUser() == 0) {
System.out.println(i);
return;
}
}
}
}