微信的发红包怎么实现,如何公平又有趣呢

328 阅读2分钟

发红包,微信领先于支付宝的主要原因之一。微信通过其简洁的页面以及红包的随机性让用户能够在春节期间隔着屏幕表达祝福,同时趣味性十足。

思路

我们可以将想要发的每个红包随机组成一个数组,然后领取的人按数组顺序领取,这样我们可以避免程序宕机,毕竟红包嘛,大多时候是许多人同时抢,如果在每次领取后重新随机计算下一个红包的值,那么可能再还未计算完成时下一个人便点下了“开”。既然是随机,就必须用上方法.random()了。

两种实现方法:

方法一:

有多少个红包便随机出多少个数,再而让它们相加组成分母,每个红包的money就等于对应的数除以分母,假设总金额为10,红包数量为5,以下是JavaScript实现代码:

function honbao(total,num){
    let gailv = []     //每个人随机的概率
    let money = []    //每个人分的钱
    let sumofgailv = 0 //红包总概率
    for(let i=0;i<num;i++){
       gailv[i] = Math.random()
       sumofgailv += gailv[i] 
}
    for(let j=0;j<num;j++){
       money[j] = parseFloat(total*(gailv[j]/sumofgailv)).toFixed(2)
    }
    return money
}
var Emoney = honbao(10,5)
console.log(Emoney);

特点:随机性强

方法二

逐个定下红包金额。用剩余的红包总额除以剩余的红包个数得到一个值乘以随机数获得下个红包的金额,假设总金额为10,红包数量为5,以下是JavaScript实现代码:

function hongbao(total, num) {
    // 发红包的那一刻就已经决定了
    // 宕机
    const arr = [];
    // 余额
    let restAmount = total;
    // 未领取人数
    let restNum = num;
    // num-1  
    for(let i =0; i < num -1; i++) {
        let amount = parseFloat(Math.random() *  (restAmount/restNum * 2)).toFixed(2)
        restAmount -= amount;
        restNum--;
        arr.push(amount)
    }
    // 最后一人的
    arr.push(parseFloat(restAmount).toFixed(2));
    return arr;
}
console.log(hongbao(10,5))

特点:更加公平

随机数算法

随机数算法在众多领域都至关重要,红包仅仅是一个小小的映射,包括计算机科学、统计学、密码学、模拟和游戏开发。就像最近爆火的植物大战僵尸杂交版,它的随机盒子模式让许多人深陷其中,还有占据每一个大学生手机的金铲铲之战。人们往往对不确定性持有内在的好奇心,随机数算法的利用场景还是很多的。那么回到主题,怎么发出公平又有趣的红包,你有什么更好的想法吗,欢迎评论。