有趣的问题,希望有人知道如何用Java做到这一点。我有 一个固定的整数值x,我希望用整数x1,x2,...,xn之和来表示 如下所示:
x = x1 + x2 + ... + xn;
例如,假设n = 3且x = 10
10 = 5 + 3 + 2;
问题是,x1,x2,... xn共享应该是均匀分布的,每次我想"分裂"值x进入不同的份额,它们应该是不同的。
任何人都知道如何做到这一点?
谢谢, 帕特里克
答案 0 :(得分:2)
这是有效的,其思想是采用最大上限x - (n -i)的随机数,即第一个元素必须上限为8,以避免下一个数字变为零。我假设需要正数,其总和为x。
Random random = new Random(System.currentTimeMillis());
for (int i = 0; i < n -1; i++) {
int j = random.nextInt(x - (n -i)) + 1;
System.out.println(j);
x -= j;
}
System.out.println(x);
答案 1 :(得分:0)
未经测试,也可能效率不高,但应该有效:
public static int[] sumNumbers(int number, int parts) {
int[] result = new int[parts];
int sum = 0;
Random random = new Random();
for (int i = 1; i < result.length; i++) {
// here is the uneffecient part:
int rand = random.nextInt(number);
if (sum + rand < number) {
result[i] = rand;
sum += rand;
} else {
i--;
}
}
result[0] = number - sum;
return result;
}
它可能是无效的,因为你可以有以下案例: 你将100分成25个数字。让我们说随机选择的前5个加起来接近100,然后你必须等待20个数字中的其余数字随机变小。
答案 2 :(得分:-1)
我做了类似的事情:
int remainder = 0;
int n = 3;
int max = 2000;
for(int i = 1; i <= n; i++)
{
int ct = 0;
if(i < n)
ct = ThreadLocalRandom.current().nextInt(0, (max - remainder));
else
ct = max - remainder;
System.out.println("Value " + i + " :" + ct);
remainder += contCt;
}