我在知乎上看到这样一个问题:微信红包的随机算法是如何实现的?有人说腾讯的实现方式大致是这样的: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;}也有人做过正态分布,方差分析,回归分析,统计模拟等,图太长就不贴了。但是所有的答案都是“选时随机”的,也就是设计了“红包池”的概念,然后在抽奖的时候随机选号。所有答案都是“随机出钱”,即随机出一个数额,然后返还。接下来,让我们换个思路。现在我们把所有的钱都换成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());}每一分钱随机抽取红包。至于回归分析,根本没有使用统计模拟。在这个例子中,我们摒弃了“抽取”、“随机金额”等传统概念,让货币具有选择感,进行“随机”行为。自然地,红包具有数量随机的属性。转变思路,不要把简单的问题复杂化。我们在编码和设计的时候,通常会考虑现实生活中的逻辑,把对象抽象成类,把行为抽象成方法。但是,我们也必须偶尔考虑思维逆转。当然,我的代码有一些缺点。思考是最重要的。
