Как сгенерировать последовательность из n случайных натуральных чисел, которые складываются до некоторого значения?

Я пытаюсь сгенерировать массив целых чисел, содержащий случайные значения, складывающиеся до определенного значения. Вот мой код:

<code>private long[] getRandoms(long size , long sum) throws Exception {
  double iniSum = 0;
  System.out.println("sum = " + sum);
  long[] ret = new long[(int) size];
  for (int i = 0 ; i < ret.length; i++) {
    ret[i] = randomInRange(1, sum);
    iniSum += ret[i];
  }

  double finSum = 0;
  for (int i = 0 ; i < ret.length; i++) {
    ret[i] =  Math.round((sum * ret[i]) / iniSum);
    System.out.println("ret[" + i +"] = " + ret[i]);
    finSum += ret[i];
  }

  if (finSum != sum) throw new Exception("Could not find " + size + " numbers adding up to " + sum  + " . Final sum = " + finSum);
  return ret;
}



private long randomInRange(long min , long max) {
  Random rand = new Random();
  long ret = rand.nextInt((int) (max - min + 1)) + min;
  System.out.println("ret = " + ret);
  return ret;
} 
</code>

Однако результаты не являются точными, например:

Could not find 100 numbers adding up to 4194304 . Final sum = 4194305.0

Я думаю, что теряю точность в этом бите:

<code>(sum * ret[i]) / iniSum
</code>

Можете ли вы порекомендовать альтернативный алгоритм или исправление в моем коде, которое может помочь мне достичь этой цели?

Ответы на вопрос(10)

Ваш ответ на вопрос