2

Interesting question, hope someone has an idea how to do this in Java. I have a fixed integer value x, that I want to represent by a sum of integers x1, x2, ...,xn such that the following holds:

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

For example, lets assume n=3 and x= 10

10 = 5 + 3 + 2;

The thing is, the x1,x2, ... xn shares should be uniformely distributed, and everytime I want to "split" the value x into the different shares, they should be different.

Anyone an idea how do could be done?

Thanks, Patrick

4

3 回答 3

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);
于 2012-12-05T10:07:26.077 回答
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 个数字随机变得非常小。

于 2012-12-05T10:03:15.143 回答
-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;
  }
于 2018-02-22T16:43:41.390 回答