首页 新闻 会员 周边

c# 实现类似微信抢红包

1
悬赏园豆:30 [已解决问题] 解决于 2018-08-21 17:49

asp.net 实现

规则:

比如共有50个人,群主发100元,15个份额(15个人中),金额区间:2~15元。

 

难点:100元发给15个人,同时又把金额完全发完,因为得奖金额区间是2~15的随机数

众里寻它的主页 众里寻它 | 初学一级 | 园豆:2
提问于:2015-04-02 13:28
< >
分享
最佳答案
0

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);
收获园豆:30
幻天芒 | 高人七级 |园豆:37175 | 2015-04-02 14:11

非常感谢!

有个问题,我测试你的中间金额,发现 一般出现在中间值 十几元 比较多,怎么调 ??

众里寻它 | 园豆:2 (初学一级) | 2015-04-02 14:35

@众里寻它: 把随机索引算法再优化下。比如把最后结果,再随机一次。这样就改变了顺序了。

幻天芒 | 园豆:37175 (高人七级) | 2015-04-02 14:44

@幻天芒: 

如果我发1000元,150名额,区间 2-50,后面一般左右的人全得到2元了

众里寻它 | 园豆:2 (初学一级) | 2015-04-02 14:51

@众里寻它: 因为代码有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);

 

幻天芒 | 园豆:37175 (高人七级) | 2015-04-02 15:01
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册