QQ红包随机数算法

xiaoxiao2021-02-28  104

关于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){ //保证最低有0.01元 everyRedPaper = minMoney; } redPageMoney = redPageMoney.subtract(everyRedPaper); redPaperNum --; redPaperList.add(everyRedPaper); } //最后的红包金额 redPaperList.add(redPageMoney); } }

什么时候抢红包

所以不难看出红包发出后第一个抢,是比较稳妥的做法,期望值平均。 而最后一个抢红包的则是比较有风险的, 假如前面的所有人都没有抢到大红包,则最后一个红包不用随机而且金额较大。


错误反馈

希望大家发现博客有错误和我提出,博主会第一时间更新文章. 谢谢. 本人邮箱:zhaitonghui.vip@foxmail.com

转载请注明原文地址: https://www.6miu.com/read-62289.html

最新回复(0)