在Java中随机“分割”整数值

时间:2012-12-05 09:51:19

标签: java random

有趣的问题,希望有人知道如何用Java做到这一点。我有 一个固定的整数值x,我希望用整数x1,x2,...,xn之和来表示 如下所示:

x = x1 + x2 + ... + xn;

例如,假设n = 3且x = 10

10 = 5 + 3 + 2;

问题是,x1,x2,... xn共享应该是均匀分布的,每次我想"分裂"值x进入不同的份额,它们应该是不同的。

任何人都知道如何做到这一点?

谢谢, 帕特里克

3 个答案:

答案 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;
  }