QQ红包随机数算法

来源:互联网 发布:在淘宝上开店货源怎么办 编辑:程序博客网 时间:2024/05/16 01:42

关于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