提交 05f75669 编写于 作者: H HappyChan

修改 AwardRateInfo 名为 AwardRateVO

上级 c0880e2a
......@@ -7,9 +7,9 @@ import java.math.BigDecimal;
* @description:
* @date 2022/2/3
*/
public class AwardRateInfo {
public class AwardRateVO {
public AwardRateInfo(String awardId, BigDecimal awardRate) {
public AwardRateVO(String awardId, BigDecimal awardRate) {
this.awardId = awardId;
this.awardRate = awardRate;
}
......@@ -39,4 +39,12 @@ public class AwardRateInfo {
public void setAwardRate(BigDecimal awardRate) {
this.awardRate = awardRate;
}
@Override
public String toString() {
return "AwardRateVO{" +
"awardId='" + awardId + '\'' +
", awardRate=" + awardRate +
'}';
}
}
package cn.happy.lottery.domain.strategy.service.algorithm;
import cn.happy.lottery.common.Constants;
import cn.happy.lottery.domain.strategy.model.vo.AwardRateInfo;
import cn.happy.lottery.domain.strategy.model.vo.AwardRateVO;
import java.math.BigDecimal;
import java.security.SecureRandom;
......@@ -34,10 +34,10 @@ public abstract class BaseAlgorithm implements IDrawAlgorithm {
* strategyId -> [awardId->begin, awardId->end]
* 策略ID -> 奖品区间概率值集合
*/
protected Map<Long, List<AwardRateInfo>> awardRateInfoMap = new ConcurrentHashMap<>();
protected Map<Long, List<AwardRateVO>> awardRateInfoMap = new ConcurrentHashMap<>();
@Override
public void initRateTuple(Long strategyId, Integer strategyMode, List<AwardRateInfo> awardRateInfoList) {
public void initRateTuple(Long strategyId, Integer strategyMode, List<AwardRateVO> awardRateVOList) {
// 前置判断
if (isExist(strategyId)){
......@@ -45,7 +45,7 @@ public abstract class BaseAlgorithm implements IDrawAlgorithm {
}
// 保存奖品信息
awardRateInfoMap.put(strategyId, awardRateInfoList);
awardRateInfoMap.put(strategyId, awardRateVOList);
// 非单项概率,不必存入缓存,因为这部分抽奖算法需要实时处理中奖概率。
if (!Constants.StrategyMode.SINGLE.getCode().equals(strategyMode)) {
......@@ -56,12 +56,12 @@ public abstract class BaseAlgorithm implements IDrawAlgorithm {
String[] rateTuple = rateTupleMap.computeIfAbsent(strategyId, k -> new String[RATE_TUPLE_LENGTH]);
int cursorVal = 0;
for (AwardRateInfo awardRateInfo : awardRateInfoList) {
for (AwardRateVO awardRateVO : awardRateVOList) {
// 循环填充概率范围值
int rateVal = awardRateInfo.getAwardRate().multiply(new BigDecimal(100)).intValue();
int rateVal = awardRateVO.getAwardRate().multiply(new BigDecimal(100)).intValue();
for (int i = cursorVal + 1; i <= (rateVal + cursorVal); i++) {
rateTuple[hashIdx(i)] = awardRateInfo.getAwardId();
rateTuple[hashIdx(i)] = awardRateVO.getAwardId();
}
cursorVal += rateVal;
......
package cn.happy.lottery.domain.strategy.service.algorithm;
import cn.happy.lottery.domain.strategy.model.vo.AwardRateInfo;
import cn.happy.lottery.domain.strategy.model.vo.AwardRateVO;
import java.util.List;
......@@ -28,9 +28,9 @@ public interface IDrawAlgorithm {
* 5. 当后续通过随机数获取到1-100的值后,可以直接定位到对应的奖品信息,通过这样的方式把轮训算奖的时间复杂度从O(n) 降低到 0(1)
*
* @param strategyId 策略ID
* @param awardRateInfoList 奖品概率配置集合 「值示例:AwardRateInfo.awardRate = 0.04」
* @param awardRateVOList 奖品概率配置集合 「值示例:AwardRateInfo.awardRate = 0.04」
*/
void initRateTuple(Long strategyId,Integer strategyMode, List<AwardRateInfo> awardRateInfoList);
void initRateTuple(Long strategyId,Integer strategyMode, List<AwardRateVO> awardRateVOList);
/**
* 判断是否已经做了数据初始化
......
package cn.happy.lottery.domain.strategy.service.algorithm.impl;
import cn.happy.lottery.domain.strategy.model.vo.AwardRateInfo;
import cn.happy.lottery.domain.strategy.model.vo.AwardRateVO;
import cn.happy.lottery.domain.strategy.service.algorithm.BaseAlgorithm;
import org.springframework.stereotype.Component;
......@@ -24,12 +24,12 @@ public class EntiretyRateRandomDrawAlgorithm extends BaseAlgorithm {
BigDecimal allRate = BigDecimal.ZERO;
// 从Map中根据策略获取奖品信息,将剩下的奖品保存到新集合中
List<AwardRateInfo> awardRateInfoList = awardRateInfoMap.get(strategyId);
List<AwardRateInfo> drawRateInfoList = new ArrayList<>();
for (AwardRateInfo awardRateInfo : awardRateInfoList) {
if (!excludeAwardIds.contains(awardRateInfo.getAwardId())) {
drawRateInfoList.add(awardRateInfo);
allRate = allRate.add(awardRateInfo.getAwardRate());
List<AwardRateVO> awardRateVOList = awardRateInfoMap.get(strategyId);
List<AwardRateVO> drawRateInfoList = new ArrayList<>();
for (AwardRateVO awardRateVO : awardRateVOList) {
if (!excludeAwardIds.contains(awardRateVO.getAwardId())) {
drawRateInfoList.add(awardRateVO);
allRate = allRate.add(awardRateVO.getAwardRate());
}
}
......@@ -48,10 +48,10 @@ public class EntiretyRateRandomDrawAlgorithm extends BaseAlgorithm {
// 整体概率核心算法,循环判断,根据新的总体概率进行换算比较
int cursorVal = 0;
String awardId = null;
for (AwardRateInfo awardRateInfo : drawRateInfoList) {
int awardRate = awardRateInfo.getAwardRate().divide(allRate, 2, BigDecimal.ROUND_UP).multiply(BigDecimal.valueOf(100)).intValue();
for (AwardRateVO awardRateVO : drawRateInfoList) {
int awardRate = awardRateVO.getAwardRate().divide(allRate, 2, BigDecimal.ROUND_UP).multiply(BigDecimal.valueOf(100)).intValue();
if (randomRate <= (awardRate + cursorVal)) {
awardId = awardRateInfo.getAwardId();
awardId = awardRateVO.getAwardId();
break;
}
cursorVal += awardRate;
......
......@@ -58,12 +58,12 @@ public abstract class AbstractDrawBase extends DrawStrategySupport implements ID
}
// 解析并初始化中奖概率数据到散列表
List<AwardRateInfo> awardRateInfoList = new ArrayList<>();
List<AwardRateVO> awardRateVOList = new ArrayList<>();
for (StrategyDetailBriefVO strategyDetail : strategyDetailList) {
awardRateInfoList.add(new AwardRateInfo(strategyDetail.getAwardId(), strategyDetail.getAwardRate()));
awardRateVOList.add(new AwardRateVO(strategyDetail.getAwardId(), strategyDetail.getAwardRate()));
}
drawAlgorithm.initRateTuple(strategyId, strategyMode, awardRateInfoList);
drawAlgorithm.initRateTuple(strategyId, strategyMode, awardRateVOList);
}
private DrawResult buildDrawResult(String uid, Long strategyId, String awardId, StrategyBriefVO strategy) {
......
package cn.happy.lottery.test.domain;
import cn.happy.lottery.common.Constants;
import cn.happy.lottery.domain.strategy.model.vo.AwardRateInfo;
import cn.happy.lottery.domain.strategy.model.vo.AwardRateVO;
import cn.happy.lottery.domain.strategy.service.algorithm.IDrawAlgorithm;
import com.alibaba.fastjson.JSON;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
......@@ -37,12 +36,12 @@ public class DrawAlgorithmTest {
public void init() {
// 奖品信息
List<AwardRateInfo> strategyList = new ArrayList<>();
strategyList.add(new AwardRateInfo("一等奖:IMac", new BigDecimal("0.05")));
strategyList.add(new AwardRateInfo("二等奖:iphone", new BigDecimal("0.15")));
strategyList.add(new AwardRateInfo("三等奖:ipad", new BigDecimal("0.20")));
strategyList.add(new AwardRateInfo("四等奖:AirPods", new BigDecimal("0.25")));
strategyList.add(new AwardRateInfo("五等奖:充电宝", new BigDecimal("0.35")));
List<AwardRateVO> strategyList = new ArrayList<>();
strategyList.add(new AwardRateVO("一等奖:IMac", new BigDecimal("0.05")));
strategyList.add(new AwardRateVO("二等奖:iphone", new BigDecimal("0.15")));
strategyList.add(new AwardRateVO("三等奖:ipad", new BigDecimal("0.20")));
strategyList.add(new AwardRateVO("四等奖:AirPods", new BigDecimal("0.25")));
strategyList.add(new AwardRateVO("五等奖:充电宝", new BigDecimal("0.35")));
// 初始化数据
randomDrawAlgorithm.initRateTuple(100001L, Constants.StrategyMode.SINGLE.getCode(), strategyList);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册