微信搶紅包 金額隨機分配邏輯


微信搶紅包 金額隨機分配邏輯

搶紅包, 算法

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 發布文章使用:只允許注冊用戶才可以訪問!



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM