asp.net 实现
规则:
比如共有50个人,群主发100元,15个份额(15个人中),金额区间:2~15元。
难点:100元发给15个人,同时又把金额完全发完,因为得奖金额区间是2~15的随机数
JS版本:
var m = [], money = 100, num = 15, min = 2, max = 15; //每个人先把最小金额拿到手 for(var i = 0; i < 15; i++){ m.push(2); } money = money - ( num * min); while(money > 0){ //在0-14之间随机 var idx = Math.floor(Math.random() * max); if(m[idx] < max){ m[idx] += 1; money -= 1; } } console.log(m);
非常感谢!
有个问题,我测试你的中间金额,发现 一般出现在中间值 十几元 比较多,怎么调 ??
@众里寻它: 把随机索引算法再优化下。比如把最后结果,再随机一次。这样就改变了顺序了。
@幻天芒:
如果我发1000元,150名额,区间 2-50,后面一般左右的人全得到2元了
@众里寻它: 因为代码有bug。在取idx的时候,你注意看,我提供的算法是:Math.floor(Math.random() * max); ,其实这里面应该乘的是num,而不是max,你说对吧。还有for循环的那个15,是硬编码,应该修改为:num。再给你提供一个修改版:
var m = [], money = 100, //总金额 num = 15, //份额 min = 2, //金额最小值 max = 15; //金额最大值 //每个人先把最小金额拿到手 for(var i = 0; i < num; i++){ m.push(min); } //计算还剩下多少钱 money -= (num * min); //随机分配,直到钱花完 while(money > 0){ //在0-14之间随机 var idx = Math.floor(Math.random() * num); if(m[idx] < max){ m[idx] += 1; money -= 1; } } console.log(m);