文章最前: 我是Octopus,这个名字来源于我的中文名--章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的动态,一起学习,共同进步。
1.利用二倍均值的方式进行红包的划分
/**
* 二倍均值法生成红包
*
* @param person 人的数量
* @param money 钱的数量
* @return 红包链表
*/
private List<Integer> generatePacketsByDoubleMean(int person, int money) {
List<Integer> list = new ArrayList<>();
Random ran = new Random();
while (person > 1) {
int num = ran.nextInt(2 * (money / person));
list.add(num);
money = money - num;
person--;
}
list.add(money);
return list;
}
时间复杂度:O(n)
空间复杂度:O(n)
2.一条线段上标记n-1个点,然后按照每个点剪断,就得到了随机数
/**
* 生成抢红包链表
*
* @param person 人的数量
* @param money 钱的数量
* @return 红包链表
*/
private List<Double> generateDoublePacketsByLineCutting(int person, int money) {
List<Double> packets = new ArrayList<>();
Random random = new Random();
Set<Double> points = new TreeSet<>();
while (points.size() < person - 1) {
// 找到n-1个点
Double num = (int) Math.round(random.nextDouble() * (money - 1) * 100) / 100.0;
points.add(num);
}
// 记录最后一个点
points.add(Double.valueOf(money));
Double proPoint = 0d;
for (Double point : points) {
// 最后进行求值取差计算
Double num2 = (int) Math.round(random.nextDouble() * (point - proPoint) * 100) / 100.0;
packets.add(num2);
proPoint = point;
}
return packets;
}时间复杂度:O(n)
空间复杂度:O(n)
版权声明:本文为zy345293721原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。