Если вы имеете дело с действительными значениями переменных, то получение двух выборок, которые становятся идентичными, маловероятно. Однако у вас есть проблема, что ваши образцы не будут единообразными. Вы гораздо чаще выбираете (0,5, 0,5), чем (1,0, 0). Единственный способ исправить это - субсэмплинг. По сути, вы делаете то, что когда вы уменьшаете пространство вдоль определенной точки, вы уменьшаете вероятность ее выбора.
Так что, в основном, вы делаете, сопоставляя все точки, которые находятся внутри единичного куба, которые удовлетворяют, которые находятся в одном и том же направлении, отображаются на отдельные точки. Эти точки в одном направлении образуют линию. Чем длиннее линия, тем больше вероятность, что вы выберете проецируемую точку. Следовательно, вы хотите сместить вероятность выбора точки обратно пропорционально длине этой линии.
Вот код, который может это сделать (при условии, что вы ищете x_is для суммирования до 1):
while(true) {
maximum = 0;
norm = 0;
sum = 0;
for (i = 0; i < N; i++) {
x[i] = random(0,1);
maximum = max(x[i], max);
sum += x[i];
norm += x[i] * x[i];
}
norm = sqrt(norm);
length_of_line = norm/maximum;
sample_probability = 1/length_of_line;
if (sum == 0 || random(0,1) > sample_probability) {
continue;
} else {
for (i = 0; i < N; i++) {
x[i] = x[i] /sum;
}
return x;
}