最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用JS實現(xiàn)搶紅包的三種算法

 更新時間:2024年03月22日 09:18:50   作者:謙宇  
對于搶紅包來說最重要的就是隨機性算法,如何確保每個人獲得金額是趨向于平均的,也就是有平均的概率去隨機,而盡量避免兩極分化,本文給大家介紹了用JS實現(xiàn)搶紅包的三種算法,文中有相關的代碼示例,需要的朋友可以參考下

對于搶紅包來說最重要的就是隨機性算法,如何確保每個人獲得金額是趨向于平均的,也就是有平均的概率去隨機,而盡量避免兩極分化。

就比如一般的隨機算法,假設有 100 元的紅包,有 10 個人去搶,第一個人去搶紅包的隨機范圍是(0, 100),一旦此人搶到足夠大的金額比如 90,剩下的 9 個人只能在不斷縮小的 10 以下的范圍隨機,這樣的獎金范圍會很受限。也就是越前面搶的人優(yōu)勢越大。

接著需要說明搶紅包的核心規(guī)則:

  • 每個人搶到的金額總和等于紅包金額
  • 確保每個人得到最小的非零金額數(shù)
  • 要保證隨機概率盡量分布均勻,避免存在可以通過技巧性鉆空子。

接著我們將使用 js 實現(xiàn)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);

就像開篇提到的,先搶的優(yōu)勢很大。

對于隨機 random() 方法大家很熟悉,但方法返回一個大于等于 0 且小于 1 的偽隨機浮點數(shù),其實并不足夠隨機,在足夠大的樣本下還是會呈現(xiàn)某種趨勢。

方法二:兩倍均值法

也就是 money = (0, M/N*2) 剩余紅包金額M,剩余人數(shù)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);

線段切割法在搶紅包等隨機分配場景中被認為比較公平的原因主要是因為:線段切割法會將總金額分割成多個小段,然后隨機分配給每個人,確保了每個人獲得的金額相對均勻,避免了出現(xiàn)極端不公平的情況。

當然這還存在一種可能分割點可能重復,我們需要重新生成。

到此這篇關于利用JS實現(xiàn)搶紅包的三種算法的文章就介紹到這了,更多相關JS搶紅包算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

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

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

    本篇文章主要介紹了Webpack打包字體font-awesome的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • JavaScript數(shù)組隨機排列實現(xiàn)隨機洗牌功能

    JavaScript數(shù)組隨機排列實現(xiàn)隨機洗牌功能

    這篇文章主要介紹了JavaScript數(shù)組隨機排列實現(xiàn)隨機洗牌功能的方法,涉及javascript中基于list.sort方法實現(xiàn)數(shù)組隨機排列的技巧,可應用于隨機洗牌,非常具有實用價值,需要的朋友可以參考下
    2015-03-03
  • WEB 前端開發(fā)中防治重復提交的實現(xiàn)方法

    WEB 前端開發(fā)中防治重復提交的實現(xiàn)方法

    這篇文章主要介紹了JS WEB 前端開發(fā)中防治重復提交的實現(xiàn)方法,涉及到表單提交的幾種方式介紹,非常不錯具有參考借鑒價值,需要的朋友可以參考下
    2016-10-10
  • JavaScript樹形數(shù)據(jù)扁平化的三種實現(xiàn)方法(遞歸/迭代/flatMap)

    JavaScript樹形數(shù)據(jù)扁平化的三種實現(xiàn)方法(遞歸/迭代/flatMap)

    樹形數(shù)據(jù)結構在前端應用中被廣泛用于表示層級關系的數(shù)據(jù),如菜單、部門結構、文件目錄等,扁平化操作通常是指將具有層級關系的樹形數(shù)據(jù)轉換為單一維度的數(shù)據(jù)結構,即數(shù)組,本文給大家介紹了JavaScript樹形數(shù)據(jù)扁平化的三種實現(xiàn)方法,需要的朋友可以參考下
    2025-08-08
  • 幾個比較實用的JavaScript 測試及效驗工具

    幾個比較實用的JavaScript 測試及效驗工具

    JavaScript 是一款強大的廣泛運用于現(xiàn)代Web站點及應用的腳本語言。作為一個技藝精湛的 Web 開發(fā)者,掌握JavaScript可以增強用戶的使用體驗,提供交互及富客戶端等功能。
    2010-04-04
  • 用js來格式化字符串示例模仿css

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

    用js來格式化字符串示例模仿css...
    2007-04-04
  • 前端文件上傳同名沖突檢測的詳細解決方案

    前端文件上傳同名沖突檢測的詳細解決方案

    在上傳文件之前,我們需要先判斷目標文件夾下是否已經(jīng)存在同名文件,這篇文章主要介紹了前端文件上傳同名沖突檢測的詳細解決方案,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2026-02-02
  • js實現(xiàn)簡易ATM功能

    js實現(xiàn)簡易ATM功能

    這篇文章主要為大家詳細介紹了js實現(xiàn)簡易ATM功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • 概述javascript在Google IE中的調(diào)試技巧

    概述javascript在Google IE中的調(diào)試技巧

    本篇文章主要是對javascript在Google IE中的調(diào)試技巧進行了介紹,需要的朋友可以過來參考下
    2016-11-11
  • JavaScript原生實現(xiàn)觀察者模式的示例

    JavaScript原生實現(xiàn)觀察者模式的示例

    下面小編就為大家分享一篇JavaScript原生實現(xiàn)觀察者模式的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12

最新評論

民勤县| 岢岚县| 普安县| 松江区| 瑞金市| 益阳市| 墨脱县| 隆尧县| 新沂市| 漠河县| 四平市| 柳河县| 石林| 安平县| 文昌市| 大冶市| 宁都县| 博爱县| 万载县| 武宁县| 扎鲁特旗| 仙游县| 静安区| 柏乡县| 松滋市| 浮梁县| 佛山市| 哈尔滨市| 铁岭县| 石楼县| 连州市| 迁西县| 陇西县| 南陵县| 沈丘县| 斗六市| 松潘县| 巴林左旗| 醴陵市| 张家口市| 长岛县|