Задача, которую вы пытаетесь выполнить, равносильна рисованию случайной точки из N-мерного единичного симплекса.
http://en.wikipedia.org/wiki/Simplex#Random_sampling может вам помочь.
Наивное решение может выглядеть следующим образом:
public static double[] getArray(int n)
{
double a[] = new double[n];
double s = 0.0d;
Random random = new Random();
for (int i = 0; i < n; i++)
{
a [i] = 1.0d - random.nextDouble();
a [i] = -1 * Math.log(a[i]);
s += a[i];
}
for (int i = 0; i < n; i++)
{
a [i] /= s;
}
return a;
}
Чтобы нарисовать точку равномерно из N-мерного единичного симплекса, мы должны взять вектор экспоненциально распределенных случайных величин, а затем нормализовать его по сумме этих переменных. Чтобы получить экспоненциально распределенное значение, мы берем отрицательный log
равномерно распределенного значения.