一、要求
5块钱生成五个红包,要注意的有:
1、生成5个随机数
2、5个随机数加起来必须等于5
3、红包要设置最小值 ,最小值不能小于0.01
4、红包要设置最大值,如果第一个红包为5,剩下四个红包没法分,这里设置最大值为4.9
5、处理金额的浮点数,两位小数。
二、分析要点
重难点部分:
1、要在最小值和最大值范围内,因此控制好生成随机数的区间
2、如何使得5个随机红包加起来总数刚好为5?
其实简单一点来说,就是前四个生成随机数,最后一个通过取剩余值即可实现。
!!!但是如果最大值或者最小值的要求比较严格,比如大于0.1小于3,这样可能会导致如果前4个如果取太小,剩余的那个超过了最大值,这时候需要更加复杂的算法去实现随机性。
三、简单取随机数算法【最小值和最大值要求不严格,其范围能保证随机数安全】
注意: Math.random()默认范围为0-1,返回float数值;如果要改变最大值为y,应该Math.random()*y;如果要改变最小值为x,应该为Math.random()+x,同时要保证最大值不变依旧为y的话,应该为Math.random()*(y-x)+x。
function generateRedPackets(totalAmount, numPackets) {
const minAmount = 0.01;
const maxAmount = 4.9;
// 生成 numPackets 个随机数
const randomAmounts = [];
let remainingAmount = totalAmount;
for (let i = 0; i < numPackets - 1; i++) {
//保证取的范围能取满5,所以随机数的最高范围应该是前面都取最小时的最坏情况
const maxPossibleAmount = remainingAmount - (numPackets - i - 1) * minAmount;
//注意范围,剩余量保证以及本身的最大值保证
const random = Math.random() * (Math.min(maxPossibleAmount, maxAmount) - minAmount) + minAmount;
const randomAmount = parseFloat(random.toFixed(2)); // 保留两位小数
randomAmounts.push(randomAmount);
remainingAmount -= randomAmount;
}
randomAmounts.push(parseFloat(remainingAmount.toFixed(2))); // 最后一个红包取剩余金额
return randomAmounts;
}
const totalAmount = 5;
const numPackets = 5;
const redPackets = generateRedPackets(totalAmount, numPackets);
console.log("Generated Red Packets:", redPackets);