分享一个js 抢红包随机算法,其他语言思路也一样

直接调用这个方法就行 传递q(金额)和r(人数就行)
保证人均最少一分钱
当剩余金额大于80%的时候,会在金额20%的区间内取大红包随机分配;
基础分配规则为,按照每人可以随机5次的要求,得出每次随机的金额,随机分给其中一人

function fen(q, r) {
//q=红包金额 单位元,最小0.01 r=分配人数
if (typeof (objs) == 'undefined') {
if (q == undefined || r == undefined || q100<r || q<0.01) {
console.log('参数错误')
return;
}
objs = {
money: q, //红包金额
num: r, //参与人数
arr: [], //返回结果
smoney: q * 100, //金额转成分
sy: q * 100, //剩余分配金额
number:0 //执行次数
}
//保底一分
for (var i = 0; i < objs.num; i++) {
objs.smoney -= 1;
objs.sy -= 1;
objs.arr.push(1)
}
}
objs.number++;
var max = objs.sy;
var f = 0;
//分配算法,等额金额保证让没人有五次机会 首次获取20%的金额当大头
var suo = (objs.smoney / objs.num / 5)
if (objs.sy > objs.smoney
0.8) {
max = objs.smoney * 0.2;
f = Math.floor(Math.random() * max) + 1
}else if (objs.sy > suo) {
max = suo;
f = Math.floor(Math.random() * max) + 1
} else {
f = max;
}
objs.sy -= f;
objs.arr[Math.floor(Math.random() * objs.arr.length) ] += f;
if (objs.sy > 0) {
//没分完重复执行
fen()
} else {
for (var i = 0; i < objs.num; i++) {
objs.arr[i] = parseFloat(objs.arr[i] / 100)
}
//返回结果,重置参数
console.log('结果:'+objs.arr, '执行次数:' + objs.number)
objs = undefined;
}
}
结果示例,如果平均每人分配不到一分钱可是会报错哦

方法二:随机分割方法;举例:1元红包分三个人抢 转换单位1元=100分;随机从中取2个值,假设是12、65;则分割的红包为【0.12(12/100)、0.53(65-12)/100、0.35(100-65)】
function hongbao(money, num) {
//money-红包金额 num-红包个数 最后返回红包数组
money = money == undefined ? 1000 : money * 100;
num = num == undefined ? 10 : num ;
if (money < num ) {
console.log("超出");
return;
}
var arr = [money];
while (arr.length < num) {
var r = Math.floor(Math.random() * money )+1;
if (arr.filter(q => q == r).length == 0) {
arr.push(r)
}
}
for (var i = 0; i < arr.length; i++) {
for (var j = 0; j < arr.length - 1; j++) {
if (arr[j] > arr[j + 1]) {
var z = arr[j+1]
arr[j + 1] = arr[j];
arr[j] = z;
}
}
}
var fen = [];
for (var i = 0; i < arr.length; i++) {
if (i == 0) {
fen.push(arr[0]/100)
} else {
fen.push((arr[i] - arr[i - 1])/100);
}
}
return fen;
}

posted @ 2024-08-31 18:26  mufuc  阅读(132)  评论(0)    收藏  举报