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

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

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

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

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

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

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

接著我們將使用 js 實(shí)現(xiàn)3種搶紅包的算法:

方法一:Math.random() 直接隨機(jī)

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); // 最后一個(gè)人搶剩下的錢

    return result;
}

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

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

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

方法二:兩倍均值法

也就是 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); // 最后一個(gè)人搶剩下的錢

    return result;
}

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

這種方法等于每次搶紅包的最大范圍為人均的兩倍。但是有個(gè)問題,最后一次還是任意的隨機(jī)。這就意味著最后搶的人收益的風(fēng)險(xiǎn)最高。

方法三:線段切割法

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);

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

當(dāng)然這還存在一種可能分割點(diǎn)可能重復(fù),我們需要重新生成。

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

相關(guān)文章

最新評(píng)論

永川市| 临清市| 虞城县| 墨玉县| 琼中| 改则县| 隆林| 平顶山市| 安溪县| 临武县| 盐边县| 浮梁县| 阿鲁科尔沁旗| 达孜县| 宕昌县| 浦城县| 望奎县| 东平县| 泾源县| 兴城市| 盈江县| 天镇县| 康马县| 观塘区| 沙河市| 博兴县| 修武县| 建宁县| 凌云县| 南靖县| 桦甸市| 德惠市| 西乌| 泾川县| 兴海县| 贞丰县| 芮城县| 吉安市| 神农架林区| 芒康县| 海口市|