QQ紅包隨機分配

思路:

將每個紅包設置一個期望值,期望值爲紅包的總金額/人數
每個紅包最大金額是:期望值的兩倍 。
每個紅包最小金額是:0.01 。
如此循環,前面的人如果搶到紅包大於期望值,
在這後面搶紅包的人期望值會變小。
隨機出 “總人數 - 1“的紅包數量,
剩下的所有金額則是最後一個紅包 --------------------- 本文來自 zhaitonghui 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/zhaitonghui/article/details/74946445?utm_source=copy

代碼:

function randomMoney1(min:number,max:number):number{

    const Num : number =  Math.floor((Math.random() * max) + min);
    // console.log("生成範圍",min,max,Num)
    return Num;
}

function hongbao1(totalMoney:number,totalPerson:number){
    console.log("隨機紅包===>金額:"+totalMoney+",人數:"+totalPerson+"最開始期望每個人的金額:"+(totalMoney/totalPerson).toFixed(2));
    let moneyArray:number[] = [];
    let Money = totalMoney * 100;
    let total = 0;
    if(totalPerson > 1){
        for(let i = 0;i<totalPerson-1;i++){
            // console.log("後面還要幾個人要分錢錢:",totalPerson - i - 1)
            let a = randomMoney1(1,Money-(totalPerson - i - 1))
            Money = (Money - a);
            total += a;
            moneyArray.push(a/100);
        }
    }
    moneyArray.push((totalMoney * 100 - total)/100)
    console.log(moneyArray);
    //驗證總數
    let aaa = 0;
    moneyArray.map((item)=>{
        aaa+=item;
    })
    console.log(aaa);
}

hongbao1(50 ,10);


console.log("-----------分割線-----------");

function randomMoney2(min:number,max:number):number{
    const Num : number =  Math.floor((Math.random() * max) + min);
    return Num;
}
function hongbao2(totalMoney:number,totalPerson:number){
    console.log("隨機紅包===>金額:"+totalMoney+",人數:"+totalPerson+"最開始期望每個人的金額:"+(totalMoney/totalPerson).toFixed(2));
    let moneyArray:number[] = [];
    let Money = totalMoney * 100;
    let total = 0;
    if(totalPerson > 1){
        for(let i = 0;i<totalPerson-1;i++){
            //添加數學期望值
            let Expect = Math.floor(Money / (totalPerson - i));
            let a = randomMoney2(1,Expect*2)
            Money = (Money - a);
            total += a;
            moneyArray.push(a/100);
        }
    }
    moneyArray.push((totalMoney * 100 - total)/100)
    console.log(moneyArray);
    //驗證總數
    let aaa = 0;
    moneyArray.map((item)=>{
        aaa+=item;
    })
    console.log(aaa);
}
hongbao2(50 ,10);

運行結果:

這裏只是需要注意的是,看第一個,沒有使用數學期望的時候,隨機數產生的範圍,簡直了...

至於最後加起來爲49.99999999999999,而不是50,這是js內部的原因,不信的話:你看這個,

作爲一個小菜鳥,我就先撤退了...大家主要看思路。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章