微信红包的随机算法是怎样实现的?本例中我们摒弃“抽取”、“随机金额”这样的传统概念,使钱拥有选择意识,执行“随机”行为,自然而然红包就有了随机金额的属性。改变一下思路,别把简单问题复杂化。

我在知乎上看到这样一个问题 微信红包随机算法是怎样完成的?

微信红包的随机算法是怎样完成的? 微信红包的随机算法是怎样完成的?(微信红包的随机算法是怎样完成的的)  微信 红包 随机 第1张

有人说腾讯大致是这样完成的:

  1. publicstaticdoublegetRandomMoney(LeftMoneyPackage_leftMoneyPackage){
  2. //remainSize剩下的红包数量
  3. //remainMoney剩下的钱
  4. if(_leftMoneyPackage.remainSize==1){
  5. _leftMoneyPackage.remainSize--;
  6. return(double)Math.round(_leftMoneyPackage.remainMoney*100)/100;
  7. }
  8. Randomr=newRandom();
  9. doublemin=0.01;//
  10. doublemax=_leftMoneyPackage.remainMoney/_leftMoneyPackage.remainSize*2;
  11. doublemoney=r.nextDouble()*max;
  12. money=money<=min?0.01:money;
  13. money=Math.floor(money*100)/100;
  14. _leftMoneyPackage.remainSize--;
  15. _leftMoneyPackage.remainMoney-=money;
  16. returnmoney;
  17. }

也有人做了正太散布、方差剖析、回归剖析、计算模仿等,图太长我就不贴了。

可是

  • 避实就虚答案都是“取时随机”,即规划“红包池”的概念,然后在抽取时随机取数。
  • 避实就虚答案都是“钱的随机”,即随机金额,然后return。

下面咱们换个思路,现在咱们把避实就虚的钱换成1分的 硬币 ,把红包幻想成 罐子 ,然后 撒币 。

  1. /**
  2. *@paramcount红包数
  3. *@parammoney总金额
  4. *@return
  5. */
  6. publicstaticInteger[]ranRedPac(Integercount,Integermoney){
  7. Integer[]result=newInteger[count];
  8. for(inti=1;i<=money;i++){
  9. intn=newRandom().nextInt(count);
  10. result[n]=result[n]==null?1:result[n]+1;
  11. }
  12. returnresult;
  13. }
  14. //测验
  15. publicstaticvoidmain(String[]args){
  16. Arrays.asList(ranRedPac(10,5000000)).forEach(i->System.out.println(i));
  17. System.out.println("sum:"+Arrays.asList(ranRedPac(10,50)).stream().mapToInt(i->i).sum());
  18. }

每分钱随机挑选红包。

至于什么回归剖析,计算模仿 通通用不上 。

本例中咱们摒弃“抽取”、“随机金额”这样的传统概念,使钱具有挑选认识,履行“随机”行为,自可是然红包就有了随机金额的特点。

改动一下思路,别把简略问题复杂化。

咱们在编码规划时,通常会考虑现实生活中的逻辑,并把目标笼统成类,行为笼统成办法。可是,咱们偶然也要考虑思想 回转 。

当然,我的代码有必定的坏处。

思想是最重要的。

转载请说明出处
知优网 » 微信红包的随机算法是怎样完成的?(微信红包的随机算法是怎样完成的的)

发表评论

您需要后才能发表评论