关于QQ红包随机生成,如何生成,什么时候抢红包比较划算。
比如QQ发一个拼手气红包,总金额为20元,7个人分。 当时简单想法是,随机出一个金额,下次总金额减去随机金额再进行随机。 但是最后金额可能会超出总金额,造成不够分的情况。 而加了很多限制条件也会造成红包看起来不是那么随机, 而是越往后面领取的红包越小。
- 下面代码的思路:
将每个红包设置一个期望值,期望值为红包的总金额/人数, 每个红包最大金额是:期望值的两倍 。 每个红包最小金额是:0.01 。 如此循环,前面的人如果抢到红包大于期望值, 在这后面抢红包的人期望值会变小。 随机出 “总人数 - 1“的红包数量, 剩下的所有金额则是最后一个红包。
package com.shine.main;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class RedPaper {
static List<BigDecimal> redPaperList =
new ArrayList<BigDecimal>();
public static void main(String[] args) {
double Money =
20;
BigDecimal
decimal =
new BigDecimal(Money);
BigDecimal redPageMoney =
decimal.setScale(
2,BigDecimal.ROUND_HALF_UP);
int redPaperNum =
7;
BigDecimal sum =
new BigDecimal(
0);
everyRedPaper(redPaperNum,redPageMoney);
for (BigDecimal rpl : redPaperList) {
System.
out.println(rpl);
sum = sum.add(rpl);
}
System.
out.println();
System.
out.println(sum.doubleValue());
}
public static void everyRedPaper(
int redPaperNum, BigDecimal redPageMoney){
Random random =
new Random();
while (redPaperNum !=
1) {
BigDecimal expectedValue = redPageMoney.divide(
new BigDecimal(redPaperNum),
7, BigDecimal.ROUND_HALF_EVEN);
BigDecimal maxMoney = expectedValue.multiply(
new BigDecimal(
2));
BigDecimal
decimal =
new BigDecimal(
0.01);
BigDecimal minMoney =
decimal.setScale(
2,BigDecimal.ROUND_DOWN);
BigDecimal everyRed = maxMoney.multiply(
new BigDecimal(random.nextDouble()));
BigDecimal everyRedPaper = everyRed.setScale(
2,BigDecimal.ROUND_DOWN);
if(everyRedPaper.compareTo(minMoney) == -
1){
everyRedPaper = minMoney;
}
redPageMoney = redPageMoney.subtract(everyRedPaper);
redPaperNum --;
redPaperList.add(everyRedPaper);
}
redPaperList.add(redPageMoney);
}
}
什么时候抢红包
所以不难看出红包发出后第一个抢,是比较稳妥的做法,期望值平均。 而最后一个抢红包的则是比较有风险的, 假如前面的所有人都没有抢到大红包,则最后一个红包不用随机而且金额较大。
错误反馈
希望大家发现博客有错误和我提出,博主会第一时间更新文章. 谢谢. 本人邮箱:zhaitonghui.vip@foxmail.com