2018年夏天,面试滴滴,第4轮技术面试,被要求实现红包算法,凭着感觉写了一个极其错误的算法。后来看到一个二倍均值法,假设当前人均值是x,那么随机数取[1,2x)(单位是分)
List<Integer> hongbao(int totalAmount, int totalNumber) {
List<Integer> list = Lists.newArrayList();
if (totalAmount <= 0 || totalNumber<= 0) {
return list;
}
for (int i = totalNumber; i >= 2; i--) {
int x = (totalAmount << 1) / i;
int random = ThreadLocalRandom.current().nextInt(1, x);
list.add(random);
totalAmount -= random;
}
list.add(totalAmount);
return list;
}
除了这种方法,还有一种线段分割法。其思想是把红包抽象成一根在数轴上的线段,线段的起点是原点,终点是红包的总金额 totalAmount,然后把线段分成N个部分,只需要生成N-1个随机数,这些随机数的范围是 [ 1 , totalAmount )
List<Integer> hongba