Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
-Bin
Lottery-702-happy
提交
05f75669
L
Lottery-702-happy
项目概览
-Bin
/
Lottery-702-happy
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
L
Lottery-702-happy
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
05f75669
编写于
3月 02, 2022
作者:
H
HappyChan
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
修改 AwardRateInfo 名为 AwardRateVO
上级
c0880e2a
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
40 addition
and
33 deletion
+40
-33
lottery-domain/src/main/java/cn/happy/lottery/domain/strategy/model/vo/AwardRateVO.java
...n/happy/lottery/domain/strategy/model/vo/AwardRateVO.java
+10
-2
lottery-domain/src/main/java/cn/happy/lottery/domain/strategy/service/algorithm/BaseAlgorithm.java
...tery/domain/strategy/service/algorithm/BaseAlgorithm.java
+7
-7
lottery-domain/src/main/java/cn/happy/lottery/domain/strategy/service/algorithm/IDrawAlgorithm.java
...ery/domain/strategy/service/algorithm/IDrawAlgorithm.java
+3
-3
lottery-domain/src/main/java/cn/happy/lottery/domain/strategy/service/algorithm/impl/EntiretyRateRandomDrawAlgorithm.java
...rvice/algorithm/impl/EntiretyRateRandomDrawAlgorithm.java
+10
-10
lottery-domain/src/main/java/cn/happy/lottery/domain/strategy/service/draw/AbstractDrawBase.java
...ottery/domain/strategy/service/draw/AbstractDrawBase.java
+3
-3
lottery-interfaces/src/test/java/cn/happy/lottery/test/domain/DrawAlgorithmTest.java
.../java/cn/happy/lottery/test/domain/DrawAlgorithmTest.java
+7
-8
未找到文件。
lottery-domain/src/main/java/cn/happy/lottery/domain/strategy/model/vo/AwardRate
Info
.java
→
lottery-domain/src/main/java/cn/happy/lottery/domain/strategy/model/vo/AwardRate
VO
.java
浏览文件 @
05f75669
...
...
@@ -7,9 +7,9 @@ import java.math.BigDecimal;
* @description:
* @date 2022/2/3
*/
public
class
AwardRate
Info
{
public
class
AwardRate
VO
{
public
AwardRate
Info
(
String
awardId
,
BigDecimal
awardRate
)
{
public
AwardRate
VO
(
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
+
'}'
;
}
}
lottery-domain/src/main/java/cn/happy/lottery/domain/strategy/service/algorithm/BaseAlgorithm.java
浏览文件 @
05f75669
package
cn.happy.lottery.domain.strategy.service.algorithm
;
import
cn.happy.lottery.common.Constants
;
import
cn.happy.lottery.domain.strategy.model.vo.AwardRate
Info
;
import
cn.happy.lottery.domain.strategy.model.vo.AwardRate
VO
;
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
<
AwardRate
Info
>>
awardRateInfoMap
=
new
ConcurrentHashMap
<>();
protected
Map
<
Long
,
List
<
AwardRate
VO
>>
awardRateInfoMap
=
new
ConcurrentHashMap
<>();
@Override
public
void
initRateTuple
(
Long
strategyId
,
Integer
strategyMode
,
List
<
AwardRate
Info
>
awardRateInfo
List
)
{
public
void
initRateTuple
(
Long
strategyId
,
Integer
strategyMode
,
List
<
AwardRate
VO
>
awardRateVO
List
)
{
// 前置判断
if
(
isExist
(
strategyId
)){
...
...
@@ -45,7 +45,7 @@ public abstract class BaseAlgorithm implements IDrawAlgorithm {
}
// 保存奖品信息
awardRateInfoMap
.
put
(
strategyId
,
awardRate
Info
List
);
awardRateInfoMap
.
put
(
strategyId
,
awardRate
VO
List
);
// 非单项概率,不必存入缓存,因为这部分抽奖算法需要实时处理中奖概率。
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
(
AwardRate
Info
awardRateInfo
:
awardRateInfo
List
)
{
for
(
AwardRate
VO
awardRateVO
:
awardRateVO
List
)
{
// 循环填充概率范围值
int
rateVal
=
awardRate
Info
.
getAwardRate
().
multiply
(
new
BigDecimal
(
100
)).
intValue
();
int
rateVal
=
awardRate
VO
.
getAwardRate
().
multiply
(
new
BigDecimal
(
100
)).
intValue
();
for
(
int
i
=
cursorVal
+
1
;
i
<=
(
rateVal
+
cursorVal
);
i
++)
{
rateTuple
[
hashIdx
(
i
)]
=
awardRate
Info
.
getAwardId
();
rateTuple
[
hashIdx
(
i
)]
=
awardRate
VO
.
getAwardId
();
}
cursorVal
+=
rateVal
;
...
...
lottery-domain/src/main/java/cn/happy/lottery/domain/strategy/service/algorithm/IDrawAlgorithm.java
浏览文件 @
05f75669
package
cn.happy.lottery.domain.strategy.service.algorithm
;
import
cn.happy.lottery.domain.strategy.model.vo.AwardRate
Info
;
import
cn.happy.lottery.domain.strategy.model.vo.AwardRate
VO
;
import
java.util.List
;
...
...
@@ -28,9 +28,9 @@ public interface IDrawAlgorithm {
* 5. 当后续通过随机数获取到1-100的值后,可以直接定位到对应的奖品信息,通过这样的方式把轮训算奖的时间复杂度从O(n) 降低到 0(1)
*
* @param strategyId 策略ID
* @param awardRate
Info
List 奖品概率配置集合 「值示例:AwardRateInfo.awardRate = 0.04」
* @param awardRate
VO
List 奖品概率配置集合 「值示例:AwardRateInfo.awardRate = 0.04」
*/
void
initRateTuple
(
Long
strategyId
,
Integer
strategyMode
,
List
<
AwardRate
Info
>
awardRateInfo
List
);
void
initRateTuple
(
Long
strategyId
,
Integer
strategyMode
,
List
<
AwardRate
VO
>
awardRateVO
List
);
/**
* 判断是否已经做了数据初始化
...
...
lottery-domain/src/main/java/cn/happy/lottery/domain/strategy/service/algorithm/impl/EntiretyRateRandomDrawAlgorithm.java
浏览文件 @
05f75669
package
cn.happy.lottery.domain.strategy.service.algorithm.impl
;
import
cn.happy.lottery.domain.strategy.model.vo.AwardRate
Info
;
import
cn.happy.lottery.domain.strategy.model.vo.AwardRate
VO
;
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
<
AwardRate
Info
>
awardRateInfo
List
=
awardRateInfoMap
.
get
(
strategyId
);
List
<
AwardRate
Info
>
drawRateInfoList
=
new
ArrayList
<>();
for
(
AwardRate
Info
awardRateInfo
:
awardRateInfo
List
)
{
if
(!
excludeAwardIds
.
contains
(
awardRate
Info
.
getAwardId
()))
{
drawRateInfoList
.
add
(
awardRate
Info
);
allRate
=
allRate
.
add
(
awardRate
Info
.
getAwardRate
());
List
<
AwardRate
VO
>
awardRateVO
List
=
awardRateInfoMap
.
get
(
strategyId
);
List
<
AwardRate
VO
>
drawRateInfoList
=
new
ArrayList
<>();
for
(
AwardRate
VO
awardRateVO
:
awardRateVO
List
)
{
if
(!
excludeAwardIds
.
contains
(
awardRate
VO
.
getAwardId
()))
{
drawRateInfoList
.
add
(
awardRate
VO
);
allRate
=
allRate
.
add
(
awardRate
VO
.
getAwardRate
());
}
}
...
...
@@ -48,10 +48,10 @@ public class EntiretyRateRandomDrawAlgorithm extends BaseAlgorithm {
// 整体概率核心算法,循环判断,根据新的总体概率进行换算比较
int
cursorVal
=
0
;
String
awardId
=
null
;
for
(
AwardRate
Info
awardRateInfo
:
drawRateInfoList
)
{
int
awardRate
=
awardRate
Info
.
getAwardRate
().
divide
(
allRate
,
2
,
BigDecimal
.
ROUND_UP
).
multiply
(
BigDecimal
.
valueOf
(
100
)).
intValue
();
for
(
AwardRate
VO
awardRateVO
:
drawRateInfoList
)
{
int
awardRate
=
awardRate
VO
.
getAwardRate
().
divide
(
allRate
,
2
,
BigDecimal
.
ROUND_UP
).
multiply
(
BigDecimal
.
valueOf
(
100
)).
intValue
();
if
(
randomRate
<=
(
awardRate
+
cursorVal
))
{
awardId
=
awardRate
Info
.
getAwardId
();
awardId
=
awardRate
VO
.
getAwardId
();
break
;
}
cursorVal
+=
awardRate
;
...
...
lottery-domain/src/main/java/cn/happy/lottery/domain/strategy/service/draw/AbstractDrawBase.java
浏览文件 @
05f75669
...
...
@@ -58,12 +58,12 @@ public abstract class AbstractDrawBase extends DrawStrategySupport implements ID
}
// 解析并初始化中奖概率数据到散列表
List
<
AwardRate
Info
>
awardRateInfo
List
=
new
ArrayList
<>();
List
<
AwardRate
VO
>
awardRateVO
List
=
new
ArrayList
<>();
for
(
StrategyDetailBriefVO
strategyDetail
:
strategyDetailList
)
{
awardRate
InfoList
.
add
(
new
AwardRateInfo
(
strategyDetail
.
getAwardId
(),
strategyDetail
.
getAwardRate
()));
awardRate
VOList
.
add
(
new
AwardRateVO
(
strategyDetail
.
getAwardId
(),
strategyDetail
.
getAwardRate
()));
}
drawAlgorithm
.
initRateTuple
(
strategyId
,
strategyMode
,
awardRate
Info
List
);
drawAlgorithm
.
initRateTuple
(
strategyId
,
strategyMode
,
awardRate
VO
List
);
}
private
DrawResult
buildDrawResult
(
String
uid
,
Long
strategyId
,
String
awardId
,
StrategyBriefVO
strategy
)
{
...
...
lottery-interfaces/src/test/java/cn/happy/lottery/test/domain/DrawAlgorithmTest.java
浏览文件 @
05f75669
package
cn.happy.lottery.test.domain
;
import
cn.happy.lottery.common.Constants
;
import
cn.happy.lottery.domain.strategy.model.vo.AwardRate
Info
;
import
cn.happy.lottery.domain.strategy.model.vo.AwardRate
VO
;
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
<
AwardRate
Info
>
strategyList
=
new
ArrayList
<>();
strategyList
.
add
(
new
AwardRate
Info
(
"一等奖:IMac"
,
new
BigDecimal
(
"0.05"
)));
strategyList
.
add
(
new
AwardRate
Info
(
"二等奖:iphone"
,
new
BigDecimal
(
"0.15"
)));
strategyList
.
add
(
new
AwardRate
Info
(
"三等奖:ipad"
,
new
BigDecimal
(
"0.20"
)));
strategyList
.
add
(
new
AwardRate
Info
(
"四等奖:AirPods"
,
new
BigDecimal
(
"0.25"
)));
strategyList
.
add
(
new
AwardRate
Info
(
"五等奖:充电宝"
,
new
BigDecimal
(
"0.35"
)));
List
<
AwardRate
VO
>
strategyList
=
new
ArrayList
<>();
strategyList
.
add
(
new
AwardRate
VO
(
"一等奖:IMac"
,
new
BigDecimal
(
"0.05"
)));
strategyList
.
add
(
new
AwardRate
VO
(
"二等奖:iphone"
,
new
BigDecimal
(
"0.15"
)));
strategyList
.
add
(
new
AwardRate
VO
(
"三等奖:ipad"
,
new
BigDecimal
(
"0.20"
)));
strategyList
.
add
(
new
AwardRate
VO
(
"四等奖:AirPods"
,
new
BigDecimal
(
"0.25"
)));
strategyList
.
add
(
new
AwardRate
VO
(
"五等奖:充电宝"
,
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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录