✨ que red package
parent
e90ac4edbe
commit
e224fbae0c
@ -0,0 +1,48 @@
|
||||
package org.alis.smallcc.algorithm.redpackage;
|
||||
|
||||
import java.util.Random;
|
||||
import java.util.concurrent.ThreadLocalRandom;
|
||||
|
||||
/**
|
||||
* 红包算法只
|
||||
* 双倍平均算法
|
||||
* <p>
|
||||
* 红包的最小单位是分 所以这里需要执行乘100的倍数
|
||||
*
|
||||
* @author robin
|
||||
* @date 2022/2/7 10:22
|
||||
*/
|
||||
public class DoubleDivide {
|
||||
|
||||
public static void main(String[] args) {
|
||||
dividePackage(10000, 10);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 双倍算法
|
||||
*
|
||||
* @param total 总金额
|
||||
* @param count 总份数
|
||||
*/
|
||||
private static void dividePackage(Integer total, Integer count) {
|
||||
int temp = count;
|
||||
int endCount = 0;
|
||||
int min = 1;
|
||||
for (int i = 1; i <= temp; i++) {
|
||||
int amount;
|
||||
if (i == temp) {
|
||||
amount = total;
|
||||
} else {
|
||||
amount = Math.max(min, ThreadLocalRandom.current().nextInt(total / count * 2 - 1) + 1 - min);
|
||||
}
|
||||
total -= amount;
|
||||
count--;
|
||||
System.out.printf("第%d 个人抢到了 %f 元%n", i, (float) amount / 100);
|
||||
endCount += amount;
|
||||
}
|
||||
System.out.printf("红包的总数是%d %n", endCount);
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,31 @@
|
||||
package org.alis.smallcc.algorithm.redpackage;
|
||||
|
||||
import java.util.concurrent.ThreadLocalRandom;
|
||||
|
||||
/**
|
||||
* 随机红包
|
||||
* 前几名拿高额钱包一定是最大的
|
||||
*
|
||||
* @author robin
|
||||
* @date 2022/2/7 10:54
|
||||
*/
|
||||
public class RandomRedPackage {
|
||||
public static void main(String[] args) {
|
||||
random(10000, 10);
|
||||
}
|
||||
|
||||
private static void random(Integer total, Integer count) {
|
||||
int min = 1;
|
||||
for (int i = 1; i <= count; i++) {
|
||||
int amount;
|
||||
if (i == count) {
|
||||
amount = total;
|
||||
} else {
|
||||
amount = Math.max(min, ThreadLocalRandom.current().nextInt(total - 1) + 1 - min);
|
||||
}
|
||||
total -= amount;
|
||||
System.out.printf("第%d 个人抢到了 %f 元%n", i, (float) amount / 100);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,61 @@
|
||||
package org.alis.smallcc.algorithm.redpackage;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 分段
|
||||
* 线段切割算法
|
||||
*
|
||||
* @author robin
|
||||
* @date 2022/2/7 11:32
|
||||
*/
|
||||
public class SegmentRedPackage {
|
||||
|
||||
public static void main(String[] args) {
|
||||
List<Integer> integers = lineCut(10000, 10);
|
||||
}
|
||||
|
||||
private static List<Integer> lineCut(int money, int people) {
|
||||
|
||||
if (money < 1 || people < 1 || money < people) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
List<Integer> team = new ArrayList<>(people - 1);
|
||||
List<Integer> result = new ArrayList<>(people);
|
||||
|
||||
Random random = new Random();
|
||||
while (team.size() < people - 1) {
|
||||
int randomMoney = random.nextInt(money) + 1;
|
||||
if (!team.contains(randomMoney)) {
|
||||
team.add(randomMoney);
|
||||
}
|
||||
}
|
||||
|
||||
Collections.sort(team);
|
||||
|
||||
System.out.print("分割点:");
|
||||
System.out.println(team.stream().map(Integer::floatValue).map(f->f/100).collect(Collectors.toList()));
|
||||
|
||||
int left = 0;
|
||||
for (Integer integer : team) {
|
||||
result.add(integer - left);
|
||||
left = integer;
|
||||
}
|
||||
result.add(money - left);
|
||||
|
||||
System.out.print("每人金额:");
|
||||
System.out.println(result.stream().map(Integer::floatValue).map(f->f/100).collect(Collectors.toList()));
|
||||
|
||||
// 验证分割后的数是否是输入的总金额
|
||||
result.stream().reduce(Integer::sum).ifPresent(amount -> {
|
||||
System.out.print("总金额:");
|
||||
System.out.println(amount);
|
||||
});
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
}
|
Loading…
Reference in New Issue