Как сгенерировать последовательность из 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>
Можете ли вы порекомендовать альтернативный алгоритм или исправление в моем коде, которое может помочь мне достичь этой цели?