Skip to content
Toggle navigation
Projects
Groups
Snippets
Help
xunj
/
festival-activites
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit 95b863fa
authored
Jan 29, 2021
by
lvyp
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
红包雨-红包发放
1 parent
6b005320
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
88 additions
and
57 deletions
activity-admin/src/main/java/com/polysoft/activity/constant/RedPacketUtil.java
activity-admin/src/main/java/com/polysoft/activity/constant/Test.java
activity-admin/src/main/java/com/polysoft/activity/constant/RedPacketUtil.java
0 → 100644
View file @
95b863f
package
com
.
polysoft
.
activity
.
constant
;
import
java.util.ArrayList
;
import
java.util.List
;
/**
* @author lvyp
* @date 2021/1/29
* 红包算法分析
* 1.设置金额的上下限 2.判断金额是否合法 3.随机产生红包
*/
public
class
RedPacketUtil
{
//1.设置金额的上下限 最少0.01,最多200
private
double
MINMONEY
;
private
double
MAXMONEY
;
private
double
TIMES
;
/**
* 4.实现红包分配,为了避免一个红包占用大量的金额,设定非最后一个红包的 最大金额,可以设置平均值的N陪,
*
* */
public
List
<
Double
>
splitRedPackets
(
double
money
,
int
count
)
{
if
(!
isRight
(
money
,
count
))
{
return
null
;
}
List
<
Double
>
list
=
new
ArrayList
<
Double
>();
double
max
=
(
double
)
(
money
*
TIMES
/
count
);
max
=
max
>
MAXMONEY
?
MAXMONEY
:
max
;
for
(
int
i
=
0
;
i
<
count
;
i
++)
{
double
one
=
randomRedPacket
(
money
,
MINMONEY
,
max
,
count
-
i
);
list
.
add
(
one
);
money
-=
one
;
}
return
list
;
}
/**
* 3.随机产生红包
*
* */
private
double
randomRedPacket
(
double
money
,
double
mins
,
double
maxs
,
int
count
)
{
if
(
count
==
1
)
{
return
(
double
)
(
Math
.
round
(
money
*
100
))
/
100
;
}
if
(
mins
==
maxs
)
{
return
mins
;
}
double
max
=
maxs
>
money
?
money
:
maxs
;
double
one
=
((
double
)
Math
.
random
()
*
(
max
-
mins
)
+
mins
);
one
=
(
double
)
(
Math
.
round
(
one
*
100
))
/
100
;
double
moneyOther
=
money
-
one
;
if
(
isRight
(
moneyOther
,
count
-
1
))
{
return
one
;
}
else
{
double
avg
=
moneyOther
/
(
count
-
1
);
if
(
avg
<
MINMONEY
)
{
return
randomRedPacket
(
money
,
mins
,
one
,
count
);
}
else
if
(
avg
>
MAXMONEY
)
{
return
randomRedPacket
(
money
,
one
,
maxs
,
count
);
}
}
return
one
;
}
public
RedPacketUtil
(
double
MINMONEY
,
double
MAXMONEY
,
double
TIMES
)
{
this
.
MINMONEY
=
MINMONEY
;
this
.
MAXMONEY
=
MAXMONEY
;
this
.
TIMES
=
TIMES
;
}
//2.判断金额是否合法 如果超过了最大值与最小值,错误
private
boolean
isRight
(
double
money
,
int
count
)
{
double
avg
=
money
/
count
;
if
(
avg
<
MINMONEY
)
{
return
false
;
}
else
if
(
avg
>
MAXMONEY
)
{
return
false
;
}
return
true
;
}
public
static
void
main
(
String
[]
args
)
{
RedPacketUtil
util
=
new
RedPacketUtil
(
5
,
100
,
2
);
List
<
Double
>
doubles
=
util
.
splitRedPackets
(
1250
,
100
);
doubles
.
forEach
(
item
->
System
.
out
.
println
(
item
));
}
}
activity-admin/src/main/java/com/polysoft/activity/constant/Test.java
deleted
100644 → 0
View file @
6b00532
package
com
.
polysoft
.
activity
.
constant
;
import
java.text.DecimalFormat
;
import
java.text.NumberFormat
;
import
java.util.ArrayList
;
import
java.util.Collections
;
import
java.util.List
;
import
java.util.Random
;
import
java.util.Scanner
;
/**
* @author lvyp
* @date 2021/1/29
*/
public
class
Test
{
public
static
void
main
(
String
[]
args
)
{
//红包数
int
number
=
10
;
//红包总额
float
total
=
100
;
float
money
;
//最小红包
double
min
=
1
;
double
max
;
int
i
=
1
;
List
math
=
new
ArrayList
();
DecimalFormat
df
=
new
DecimalFormat
(
"###.##"
);
while
(
i
<
number
)
{
//保证即使一个红包是最大的了,后面剩下的红包,每个红包也不会小于最小值
max
=
total
-
min
*
(
number
-
i
);
int
k
=
(
int
)(
number
-
i
)
/
2
;
//保证最后两个人拿的红包不超出剩余红包
if
(
number
-
i
<=
2
)
{
k
=
number
-
i
;
}
//最大的红包限定的平均线上下
max
=
max
/
k
;
//保证每个红包大于最小值,又不会大于最大值
money
=
(
int
)
(
min
*
100
+
Math
.
random
()
*
(
max
*
100
-
min
*
100
+
1
));
money
=
(
float
)
money
/
100
;
//保留两位小数
money
=
Float
.
parseFloat
(
df
.
format
(
money
));
total
=(
int
)(
total
*
100
-
money
*
100
);
total
=
total
/
100
;
math
.
add
(
money
);
System
.
out
.
println
(
"第"
+
i
+
"个人拿到"
+
money
+
"剩下"
+
total
);
i
++;
//最后一个人拿走剩下的红包
if
(
i
==
number
)
{
math
.
add
(
total
);
System
.
out
.
println
(
"第"
+
i
+
"个人拿到"
+
total
+
"剩下0"
);
}
}
//取数组中最大的一个值的索引
System
.
out
.
println
(
"本轮发红包中第"
+
(
math
.
indexOf
(
Collections
.
max
(
math
))
+
1
)
+
"个人手气最佳"
);
}
}
Write
Preview
Markdown
is supported
Attach a file
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to post a comment