So what i need is basically described in the subject.
Like if i would put in number 12 and amount of parts it should devide into, i would like it to return something like (with 4 parts) 8, 2, 1, 1. But not doubles because i need the values as int.
I had found one answer earlier but it only worked using doubles. not ints.
(this is the one i found)
public double[] divideUniformlyRandomly(double number, int part) {
double uniformRandoms[] = new double[part];
Random random = new Random();
double mean = number / part;
double sum = 0.0;
for (int i=0; i<part / 2; i++) {
uniformRandoms[i] = random.nextDouble() * mean;
uniformRandoms[part - i - 1] = mean + random.nextDouble() * mean;
sum += uniformRandoms[i] + uniformRandoms[part - i -1];
}
uniformRandoms[(int)Math.ceil(part/2)] = uniformRandoms[(int)Math.ceil(part/2)] + number - sum;
return uniformRandoms;
I had tried changing this code to work using Ints by doing this:
public int[] divide(int number) {
int part = getDivider(number);
int uniformRandoms[] = new int[part];
Random random = new Random();
int mean = number / part;
int sum = 0;
for (int i=0; i<part / 2; i++) {
uniformRandoms[i] = random.nextInt() * mean;
uniformRandoms[part - i - 1] = mean + random.nextInt() * mean;
sum += uniformRandoms[i] + uniformRandoms[part - i -1];
}
uniformRandoms[(int)Math.round(part/2)] = uniformRandoms[(int)Math.round(part/2)] + number - sum;
for(int i : uniformRandoms)
System.out.println(i);
return uniformRandoms;
}
But when running that using number: 512 and using 10 parts (getDivider() will return 10) itll output this:
-1058809647, -2102647561, 469849949, 1627965716, -290084223, -33347991
And alot more of this kind of numbers.
Thanks.
Here's an algorithm which will do the job:
parts+1
.number
to the array, then fill the remainder of it with unique random values usingrandom.nextInt(number-1) + 1
to get values between 0 andnumber
exclusive of the range limits.array[i] - array[i-1]
will be a set of positive integers that sum tonumber
.If zeros are allowed, then you don't need the uniqueness criterion in filling the array. If you need uniqueness, you might consider adding random values to a
HashSet
(which only.add()
's unique entries) until the size meets your requirement, then convert it with.toArray()
.Here's an actual implementation:
This produces results such as
[3, 2, 1, 2, 4]
or[1, 5, 2, 3, 1]
.A inefficient but very easy way would be to loop n times and increment one of the indices by one.
divider(1000, 20)
could output:On my way to old PC it takes only 11ms to divide
100.000
in 20 different "containers". So if you are not using this very often and/or on very big numbers this is a perfectly valid way to do it.Assuming every term should at least be 1.
This is not uniformly distributed. For that one could iterate till remainder becomes 0, everytime randomly picking an index to increase. Or so. Have fun.
Was this homework?
Use Random#nextInt(int)