微信群抢红包🧧随机算法

525 阅读1分钟

思路:

totalVal:🧧总金额

total:🧧数量

min:0.01

max:剩余金额平均x2 ,这里关键!!!参考了其他代码,具体为啥。。。。喃??大佬指点🙏(🌰:100元红包分5个平均是20x2,max=4,比如前面三个总共抢到了40,那第四个人的随机是(100-40)/7 x2)

🌰:total=2,第一个人抢到了0.01,第二个人就是99.99几乎为100=平均*2

randomMoney:每次抢到的随机🧧

randomMoney=min~max

//随机金额
function random(min, max) {
  return parseFloat(parseFloat(Math.random() * (max - min) - min).toFixed(2));
}
//抢红包🧧算法
function redBag(totalVal, total) {
  if (total===1) {
    return totalVal;
  }
  if(!total){
    return new Error('total must be big than 0')
  }
  let result = [];
  const min = 0.01;
  let max = (totalVal / total) * 2;
  while (total > 1) {
    max = Math.floor(totalVal / total) * 2;//每次的最大是平均*2 比如100元红包分2个人,那第一次随机数是0.01~100/5*2,可以理解为一个人抢到了接近0,另一个抢到了100
    let randomMoney //每次随机红包
    if(total===2){
        randomMoney = totalVal <= min ? min : random(min, max-0.01);  //倒数第二个
    }else{
        randomMoney = totalVal <= min ? min : random(min, max); //other
    }
    result.push(randomMoney);
    totalVal = Number(
      parseFloat(Math.round((totalVal - randomMoney) * 100) / 100).toFixed(2)
    ); //每次抢完红包剩余的金额
    total--;
  }
  result.push(totalVal);
  return result;
}

let arr = redBag(100, 8);
console.log(arr);
let s = Math.round(
  arr.reduce((a, b) => {
    return a + b;
  })
);
console.log(s);