利用JS实现抢红包的三种算法

 更新时间:2024年03月22日 09:18:50   作者:谦宇  
对于抢红包来说最重要的就是随机性算法,如何确保每个人获得金额是趋向于平均的,也就是有平均的概率去随机,而尽量避免两极分化,本文给大家介绍了用JS实现抢红包的三种算法,文中有相关的代码示例,需要的朋友可以参考下

对于抢红包来说最重要的就是随机性算法,如何确保每个人获得金额是趋向于平均的,也就是有平均的概率去随机,而尽量避免两极分化

就比如一般的随机算法,假设有 100 元的红包,有 10 个人去抢,第一个人去抢红包的随机范围是(0, 100),一旦此人抢到足够大的金额比如 90,剩下的 9 个人只能在不断缩小的 10 以下的范围随机,这样的奖金范围会很受限。也就是越前面抢的人优势越大。

接着需要说明抢红包的核心规则:

  • 每个人抢到的金额总和等于红包金额
  • 确保每个人得到最小的非零金额数
  • 要保证随机概率尽量分布均匀,避免存在可以通过技巧性钻空子。

接着我们将使用 js 实现3种抢红包的算法:

方法一:Math.random() 直接随机

function getRandomMoney(totalMoney, totalPeople) {
    let remainMoney = totalMoney;
    let remainPeople = totalPeople;
    let result = [];

    for (let i = 1; i < totalPeople; i++) {
        let max = remainMoney - remainPeople + 1;
        let money = Math.random() * max;
        money = Math.floor(money * 100) / 100; 
        result.push(money);
        remainMoney -= money;
        remainPeople--;
    }

    result.push(remainMoney); // 最后一个人抢剩下的钱

    return result;
}

let totalMoney = 100;
let totalPeople = 5;
let result = getRandomMoney(totalMoney, totalPeople);
console.log(result);

就像开篇提到的,先抢的优势很大。

对于随机 random() 方法大家很熟悉,但方法返回一个大于等于 0 且小于 1 的伪随机浮点数,其实并不足够随机,在足够大的样本下还是会呈现某种趋势。

方法二:两倍均值法

也就是 money = (0, M/N*2) 剩余红包金额M,剩余人数N。

function getDoubleAverage(totalMoney, totalPeople) {
    let remainMoney = totalMoney;
    let remainPeople = totalPeople;
    let result = [];

    for (let i = 0; i < totalPeople - 1; i++) {
        let avg = remainMoney / remainPeople * 2;
        let money = Math.random() * avg;
        money = Math.floor(money * 100) / 100; 
        result.push(money);
        remainMoney -= money;
        remainPeople--;
    }

    result.push(remainMoney); // 最后一个人抢剩下的钱

    return result;
}

let totalMoney = 100;
let totalPeople = 5;
let result = getDoubleAverage(totalMoney, totalPeople);
console.log(result);

这种方法等于每次抢红包的最大范围为人均的两倍。但是有个问题,最后一次还是任意的随机。这就意味着最后抢的人收益的风险最高。

方法三:线段切割法

function getRandomMoney(total, num) {
    if (num === 1) {
        return total;
    }

    let max = total - 0.01 * num;
    let randomArr = [0, total];

    for (let i = 1; i < num; i++) {
        let random = Math.random() * max;
        randomArr.push(random);
    }

    randomArr.sort((a, b) => a - b);

    let result = [];
    for (let j = 0; j < num; j++) {
        let money = (randomArr[j + 1] - randomArr[j]).toFixed(2);
        result.push(parseFloat(money));
    }

    return result;
}

let totalMoney = 100;
let totalPeople = 5;
let moneyList = getRandomMoney(totalMoney, totalPeople);
console.log(moneyList);

线段切割法在抢红包等随机分配场景中被认为比较公平的原因主要是因为:线段切割法会将总金额分割成多个小段,然后随机分配给每个人,确保了每个人获得的金额相对均匀,避免了出现极端不公平的情况。

当然这还存在一种可能分割点可能重复,我们需要重新生成。

到此这篇关于利用JS实现抢红包的三种算法的文章就介绍到这了,更多相关JS抢红包算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Webpack打包字体font-awesome的方法示例

    Webpack打包字体font-awesome的方法示例

    本篇文章主要介绍了Webpack打包字体font-awesome的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • JavaScript数组随机排列实现随机洗牌功能

    JavaScript数组随机排列实现随机洗牌功能

    这篇文章主要介绍了JavaScript数组随机排列实现随机洗牌功能的方法,涉及javascript中基于list.sort方法实现数组随机排列的技巧,可应用于随机洗牌,非常具有实用价值,需要的朋友可以参考下
    2015-03-03
  • WEB 前端开发中防治重复提交的实现方法

    WEB 前端开发中防治重复提交的实现方法

    这篇文章主要介绍了JS WEB 前端开发中防治重复提交的实现方法,涉及到表单提交的几种方式介绍,非常不错具有参考借鉴价值,需要的朋友可以参考下
    2016-10-10
  • JavaScript树形数据扁平化的三种实现方法(递归/迭代/flatMap)

    JavaScript树形数据扁平化的三种实现方法(递归/迭代/flatMap)

    树形数据结构在前端应用中被广泛用于表示层级关系的数据,如菜单、部门结构、文件目录等,扁平化操作通常是指将具有层级关系的树形数据转换为单一维度的数据结构,即数组,本文给大家介绍了JavaScript树形数据扁平化的三种实现方法,需要的朋友可以参考下
    2025-08-08
  • 几个比较实用的JavaScript 测试及效验工具

    几个比较实用的JavaScript 测试及效验工具

    JavaScript 是一款强大的广泛运用于现代Web站点及应用的脚本语言。作为一个技艺精湛的 Web 开发者,掌握JavaScript可以增强用户的使用体验,提供交互及富客户端等功能。
    2010-04-04
  • 用js来格式化字符串示例模仿css

    用js来格式化字符串示例模仿css

    用js来格式化字符串示例模仿css...
    2007-04-04
  • 前端文件上传同名冲突检测的详细解决方案

    前端文件上传同名冲突检测的详细解决方案

    在上传文件之前,我们需要先判断目标文件夹下是否已经存在同名文件,这篇文章主要介绍了前端文件上传同名冲突检测的详细解决方案,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2026-02-02
  • js实现简易ATM功能

    js实现简易ATM功能

    这篇文章主要为大家详细介绍了js实现简易ATM功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-10-10
  • 概述javascript在Google IE中的调试技巧

    概述javascript在Google IE中的调试技巧

    本篇文章主要是对javascript在Google IE中的调试技巧进行了介绍,需要的朋友可以过来参考下
    2016-11-11
  • JavaScript原生实现观察者模式的示例

    JavaScript原生实现观察者模式的示例

    下面小编就为大家分享一篇JavaScript原生实现观察者模式的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12

最新评论