微信搶紅包 金額隨機分配邏輯
搶紅包, 算法
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 發布文章使用:只允許注冊用戶才可以訪問!