思路:
將每個紅包設置一個期望值,期望值爲紅包的總金額/人數,
每個紅包最大金額是:期望值的兩倍 。
每個紅包最小金額是: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內部的原因,不信的話:你看這個,
作爲一個小菜鳥,我就先撤退了...大家主要看思路。