复习时遇到的一道设计题,感觉挺有意思的。
总额为num的红包,分给若干个人,要求每个人不能抢到空的红包,每个红包的金额不能过于接近,应该有大有小。
一个不错的思路:将人数people看作是people个线段,那么我们只需要在线段上随机选出people-1个不重复的点,最后将这people-1个点以及首尾两个哨兵端点看作一条线,计算每个相邻点之间的距离就对应红包的大小——总额为num看作长度为num的线段,分红包问题转换为划分线段的问题。
当发红包的发出红包之后,这个红包就经过一次“分割算法”将若干个包存入数据结构中,而抢红包的线程其实就是互斥的取出红包即可。
这里做一个限定:红包的发出金额应该是一个整数,红包大小和总金额最大保留到两位小数,而且人数也是整数,单个红包也不能低于0.01元,其他的一些校验能省则省了。
由于浮点数自身存储的就是一个近似值,因此为了计算准确性,我们先使用整型进行计算,最后对结果除以100.00转换为浮点数
double[] fun(int people,int num)
准备工作:num扩大100倍、待填充的端点数组、产生随机数的对象、用于去重的端点数组
num*=100;
if(num/people<1)throw new IllegalStateException("至少每个人也要有一分钱吧!"