抢红包
抢红包规则
1.所有人抢到金额之和等于红包金额,不能超过,也不能少于。
2.每个人至少抢到一分钱。
3.要保证所有人抢到金额的几率相等。
线段切割法
const redPacket = () => {
const people = 3;
const allMoney = 100;
let list: any = [];
let i = 1;
while (i < people) {
i++;
const reg = /^(([1-9]{1}\d*)|(0{1}))(\.\d{1})/; //正则 保留小数点后1位
const dot = parseFloat((Math.random() * allMoney+0.1).toString().match(reg)![0]); // Math.random() * allMoney+0.1 保证最小为0.1
if (list.some((value: number) => value === dot)) { // 防止点重复
i--;
}
list = [...list, dot];
}
list = [...list, 0, allMoney].sort((a: number, b: number) => a - b); // 排序
const getRedPacketlist=list
.map((value: number, index: number): any => {
if (index < list.length - 1) {
return (list[index + 1] - value).toFixed(1); // 由于精度问题 需要用toFixed处理
}
})
.toString()
.replaceAll(',', ' ')
console.log('红包列',getRedPacketlist)
};
// 时间复杂度 待优化。。。。