可能不太公平,但是不会超过边界。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>red-pack</title>
</head>
<body>
<script>
function genRandom(min, max, int = true) {
const random = min + (max - min) * Math.random();
return int ? Math.floor(random) : random;
}
// 最小0.1元起步吧?。。
function genRedPack(n, total) {
// 因为金额一般两位小数,所以整体放到了100倍,避免浮点数操作
const scale = 100;
n *= 100;
let balance = n;
const gifts = Array.from({length: total}, () => {
// 每人最少0.01元
const money = genRandom(1, balance > n / 4 ? balance / 4 : balance); // 主要控制比例,此处无法注释
balance -= money;
return money;
});
if (balance > 0) {
gifts[genRandom(0, total)] += balance;
}
// 测试
if (eval(gifts.join('+')) !== n) {
throw('QA:未通过');
}
return gifts.map(item => item / scale);
}
let count = 1000;
while (count--) {
console.log(genRedPack(0.1, 3));
}
</script>
</body>
</html>