每个人依次生成随机数,如果满足条件且小于剩余钱数,给这个人分钱,对下一个人;
如果到了最后一个人那么判断剩余钱数是否满足条件。如果 OK 那么找到一个方案。否则前一个人重新来
import java.util.Arrays;
import java.util.Random;
public class RedBag {
private Random random = new Random();
public static void main(String[] args) {
int[] r = new RedBag().resolve(new int[10], 10,0, 100, 100);
System.out.println(Arrays.toString(r));
r = new RedBag().resolve(new int[10], 10, 0, 10, 10);
System.out.println(Arrays.toString(r));
}
/// result: Result for each persion
/// N: Total number of person
/// n: Current person, [0, N - 1]
/// M: Total money
/// m: How much money left
private int[] resolve(int[] result, int N, int n, int M, int m) {
// Last person, and the left money is OK
if (n == N - 1) {
if (m >= 1 && m < 0.3 * M) {
result[n] = m;
return result;
} else {
return null;
}
}
// left money cannot give at least $1 per person
if (m < N - n) {
return null;
}
int value = 0;
while (true) {
// Try to give some money to current person
int range = Math.min(m, (int) Math.floor(0.3 * M));
value = random.nextInt(range) + 1;
if (value < m) {
result[n] = value;
int[] r = resolve(result, N, n + 1, M, m - value);
if (r != null) {
return r;
}
}
}
}
}
如果这样比较危险:
1. 没有管理员或者 sudo
2. IT 安装一些后台管理软件,典型的包括 jumpcloud, JAMF 等等, 这些东西理论上能监控你在电脑上的一举一动。
如果这样的话强烈建议公私分开。