zoukankan      html  css  js  c++  java
  • xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!

    微信抢红包 金额随机分配逻辑

    抢红包, 算法

    Q:
    红包里的金额分配怎么算?为什么出现各个红包金额相差很大?

    A:
    随机,额度在0.01和(剩余平均值*2)之间。(二倍均值算法)

    例如:发100块钱,总共10个红包,那么平均值是10块钱一个,那么发出来的红包的额度在0.01元~20元之间波动。

    当前面3个红包总共被领了40块钱时,剩下60块钱,总共7个红包,那么这7个红包的额度在:0.01~(60/7*2)=17.14之间。

    注意:这里的算法是每被抢一个后,剩下的会再次执行上面的这样的算法(也觉得上述算法太复杂,不知基于什么样的考虑)。

    这样算下去,会超过最开始的全部金额,因此到了最后面如果不够这么算,那么会采取如下算法:保证剩余用户能拿到最低1分钱即可。

    如果前面的人手气不好,那么后面的余额越多,红包额度也就越多,因此实际概率一样的。

    java

    remove copy event

    public static double getRandomMoney(RedPackage _redPackage) {
        // remainSize 剩余的红包数量
        // remainMoney 剩余的钱
        if (_redPackage.remainSize == 1) {
            _redPackage.remainSize--;
            return (double) Math.round(_redPackage.remainMoney * 100) / 100;
        }
        Random r     = new Random();
        double min   = 0.01; //
        double max   = _redPackage.remainMoney / _redPackage.remainSize * 2;
        double money = r.nextDouble() * max;
        money = money <= min ? 0.01: money;
        money = Math.floor(money * 100) / 100;
        _redPackage.remainSize--;
        _redPackage.remainMoney -= money;
        return money;
    }
    

    算法需要满足以下几点要求

    1、每个人都要能够领取到红包;

    2、每个人领取到的红包金额总和=总金额;

    3、每个人领取到的红包金额不等,但也不能差的太离谱;

    shuffle

    洗牌算法

    "use strict";
    
    /**
     *
     * @author xgqfrms
     * @license MIT
     * @copyright xgqfrms
     * @created 2020-07-20
     * @modified
     *
     * @description shuffle 洗牌算法
     * @difficulty Easy
     * @complexity O(n)
     * @augments
     * @example
     * @link https://www.cnblogs.com/xgqfrms/p/11977189.html
     * @solutions
     *
     */
    
    const log = console.log;
    
    const shuffle = (arr = []) => {
      let len = arr.length;
      while (len > 1){
        // Math.floor
        const index = Math.floor(Math.random() * len--);
        // ES6 swap
        [
          arr[len],
          arr[index],
        ] = [
          arr[index],
          arr[len],
        ];
      }
      return arr;
    }
    
    

    https://www.cnblogs.com/xgqfrms/p/11977189.html

    refs

    截尾正态随机数分布

    https://www.zhihu.com/question/22625187

    https://www.jianshu.com/p/026ceece4d80



    ©xgqfrms 2012-2020

    www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!


  • 相关阅读:
    Win32++ Home Page
    CEGUI Home Page
    迁移DirectX11到VS2015 Win10
    Oracle常用查看表结构命令
    PLSQL常用配置
    PLSQL DEVELOPER
    WeblogicException
    java.nio.Buffer
    spring batch
    vi
  • 原文地址:https://www.cnblogs.com/xgqfrms/p/13687916.html
Copyright © 2011-2022 走看看