发红包
03/21/2025
题目描述
设计一个算法,给定一个红包金额和红包数量,返回一个红包列表,要求红包金额总和等于给定的金额,并且每个红包金额不小于0.01元。
要尽可能的随机。
本人题解
const sendRedpocket = (money: number, count: number) => {
const dots:number[] = [];
while(dots.length < count - 1) {
let value = 0;
while (value === 0 || dots.includes(value)) {
value = parseFloat((Math.random() * money).toFixed(2));
}
dots.push(value);
}
dots.sort((a, b) => a - b);
const result:number[] = []
dots.forEach((dot, index) => {
result.push(parseFloat((dot - (index === 0 ? 0 : dots[index - 1])).toFixed(2)))
})
result.push(parseFloat((money - dots[dots.length - 1]).toFixed(2)))
return result;
}
console.log(sendRedpocket(100, 10))分析
这里是用的线段切割法,先随机生成count-1个点,然后排序,然后计算每个线段的长度,然后返回。
如果只是单纯的 每次都是 left * Math.random(),那么最后的结果会趋向于 0.01 元。