微信红包的随机算法是怎样实现的?本例中我们摒弃“抽取”、“随机金额”这样的传统概念,使钱拥有选择意识,执行“随机”行为,自然而然红包就有了随机金额的属性。改变一下思路,别把简单问题复杂化。
我在知乎上看到这样一个问题 微信红包的随机算法是怎样完成的?
有人说腾讯大致是这样完成的:
- publicstaticdoublegetRandomMoney(LeftMoneyPackage_leftMoneyPackage){
- //remainSize剩下的红包数量
- //remainMoney剩下的钱
- if(_leftMoneyPackage.remainSize==1){
- _leftMoneyPackage.remainSize--;
- return(double)Math.round(_leftMoneyPackage.remainMoney*100)/100;
- }
- Randomr=newRandom();
- doublemin=0.01;//
- doublemax=_leftMoneyPackage.remainMoney/_leftMoneyPackage.remainSize*2;
- doublemoney=r.nextDouble()*max;
- money=money<=min?0.01:money;
- money=Math.floor(money*100)/100;
- _leftMoneyPackage.remainSize--;
- _leftMoneyPackage.remainMoney-=money;
- returnmoney;
- }
也有人做了正太散布、方差剖析、回归剖析、计算模仿等,图太长我就不贴了。
可是
- 避实就虚答案都是“取时随机”,即规划“红包池”的概念,然后在抽取时随机取数。
- 避实就虚答案都是“钱的随机”,即随机金额,然后return。
下面咱们换个思路,现在咱们把避实就虚的钱换成1分的 硬币 ,把红包幻想成 罐子 ,然后 撒币 。
- /**
- *@paramcount红包数
- *@parammoney总金额
- *@return
- */
- publicstaticInteger[]ranRedPac(Integercount,Integermoney){
- Integer[]result=newInteger[count];
- for(inti=1;i<=money;i++){
- intn=newRandom().nextInt(count);
- result[n]=result[n]==null?1:result[n]+1;
- }
- returnresult;
- }
- //测验
- publicstaticvoidmain(String[]args){
- Arrays.asList(ranRedPac(10,5000000)).forEach(i->System.out.println(i));
- System.out.println("sum:"+Arrays.asList(ranRedPac(10,50)).stream().mapToInt(i->i).sum());
- }
每分钱随机挑选红包。
至于什么回归剖析,计算模仿 通通用不上 。
本例中咱们摒弃“抽取”、“随机金额”这样的传统概念,使钱具有挑选认识,履行“随机”行为,自可是然红包就有了随机金额的特点。
改动一下思路,别把简略问题复杂化。
咱们在编码规划时,通常会考虑现实生活中的逻辑,并把目标笼统成类,行为笼统成办法。可是,咱们偶然也要考虑思想 回转 。
当然,我的代码有必定的坏处。
思想是最重要的。
转载请说明出处
知优网 » 微信红包的随机算法是怎样完成的?(微信红包的随机算法是怎样完成的的)
知优网 » 微信红包的随机算法是怎样完成的?(微信红包的随机算法是怎样完成的的)