揭秘大厂常考的微信红包算法🧧

112 阅读5分钟

家人们👋,今天咱们要深入探讨一个在大厂面试中经常出现的算法 —— 微信红包算法。想当年,微信红包可是如同一场金融界的 “龙卷风”🌪️,一夜之间让无数用户纷纷开通微信支付,它的影响力简直惊人😎。那么,这个神奇的红包算法背后到底隐藏着怎样的奥秘呢?让我们一起揭开它的神秘面纱。

红包算法的核心需求剖析

在开始研究代码之前,咱们得先搞清楚红包算法需要达成的目标。对于微信红包而言,产品经理提出的需求其实很明确:给定一个总金额和要发放的红包个数,算法需要生成一组随机金额的红包,而且这些红包的金额总和必须等于最初给定的总金额🤔。

举个形象的例子,假如我们要发一个总金额为 100 元的红包,并且要分成 10 个小红包。那么,最终生成的这 10 个小红包,它们各自的金额可以不同,但加起来必须丝毫不差地等于 100 元。同时,每个红包的金额还得有一定的随机性,这样大家在抢红包的时候才会充满惊喜和乐趣🎉。

代码实现的详细解读

接下来,我们就来详细看看具体的代码实现。下面是一段用 JavaScript 编写的红包算法代码:

/**
 * 
 * @param {Number} total 
 * @param {Number} num
 * @returns {number[]} 
 */
function hongbao(total,num){
    const arr=[];
    let restAmount=total; //剩余金额
    let restNum=num; //剩余数量
    for(let i=0;i<num-1;i++){
        // Math
        // 包装类 
        const amount=(Math.random()*(restAmount/restNum*2)).toFixed(2); //随机金额
        restAmount-=amount; //剩余金额
        restNum--; //剩余数量
        arr.push(amount); //存入数组
    }
    arr.push(restAmount.toFixed(2)); //存入数组
    // - 公平性
    // 平均值
    // 随机性
    return arr;
}
console.log(hongbao(100,10));

代码结构与变量初始化

  • 函数定义:我们定义了一个名为 hongbao 的函数,它接收两个参数:total 表示要发放的红包总金额,num 表示要发放的红包个数。这个函数的返回值是一个包含每个红包金额的数组。

  • 变量初始化

    • arr:这是一个空数组,用于存储每个红包的金额。
    • restAmount:初始值被设置为传入的总金额 total,它表示在发放过程中还剩下多少金额可以用来发红包。
    • restNum:初始值为传入的红包个数 num,它表示还剩下多少个红包没有发放。

循环生成红包金额

  • 循环次数:使用 for 循环,循环次数为 num - 1。为什么是 num - 1 呢?因为最后一个红包的金额可以通过剩余的总金额直接确定,不需要再进行随机计算。
  • 随机金额生成:在每次循环中,通过 Math.random()*(restAmount/restNum*2) 来生成一个随机金额。这里的 Math.random() 函数会返回一个介于 0(包含)和 1(不包含)之间的随机小数。restAmount/restNum 表示当前每个红包的平均金额,乘以 2 是为了保证生成的随机金额有一定的波动范围,避免出现某个红包金额过小或过大的情况。
  • 金额处理:使用 toFixed(2) 方法将生成的随机金额保留两位小数,这是因为在实际的红包场景中,金额通常只需要精确到小数点后两位。
  • 更新剩余信息:每次生成一个红包金额后,我们需要更新 restAmount 和 restNum 的值。从 restAmount 中减去当前生成的红包金额,同时将 restNum 减 1,表示已经发放了一个红包。
  • 存储红包金额:将生成的红包金额存入数组 arr 中。

处理最后一个红包

  • 当循环结束后,我们将剩余的金额作为最后一个红包的金额。因为前面已经发放了 num - 1 个红包,所以剩余的金额就是最后一个红包的金额。使用 restAmount.toFixed(2) 将其保留两位小数后,存入数组 arr 中。

返回结果

  • 最后,函数返回存储所有红包金额的数组 arr

测试代码及结果分析

在代码的最后,我们调用了 hongbao(100, 10) 函数,并将结果打印到控制台。这意味着我们要发 10 个总金额为 100 元的红包。运行代码后,你会看到一个包含 10 个随机金额的数组,这些金额加起来正好是 100 元👏。每次运行代码,你都会得到不同的结果,这就体现了红包金额的随机性。

总结

通过上面详细的代码和解释,我们成功实现了一个简单的微信红包算法。这个算法既保证了红包金额的随机性,让每个用户都有机会抢到不同金额的红包,又满足了总金额的要求,确保所有红包金额之和等于最初设定的总金额。如果你正在准备大厂的面试,不妨把这个算法好好研究一下,说不定面试的时候就会遇到哦😏。

希望这篇文章能帮助你更好地理解微信红包算法。如果你有任何问题或者想法,欢迎在评论区留言交流🥰。