QQ红包随机分配
思路:
将每个红包设置一个期望值,期望值为红包的总金额/人数,
每个红包最大金额是:期望值的两倍 。
每个红包最小金额是:0.01 。
如此循环,前面的人如果抢到红包大于期望值,
在这后面抢红包的人期望值会变小。
随机出 “总人数 - 1“的红包数量,
剩下的所有金额则是最后一个红包 --------------------- 本文来自 zhaitonghui 的**** 博客 ,全文地址请点击:https://blog.****.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内部的原因,不信的话:你看这个,
作为一个小菜鸟,我就先撤退了...大家主要看思路。