Что заставляет вас думать, что вам нужно отсортировать по весу, чтобы выбрать случайные числа?
Я бы сделал:
int[] numbers;
int[] weight;
int totalweight;
for (int n : numbers) {
totalweight += weight[n];
}
int t = new Random().nextInt(totalWeight);
for (int n : numbers) {
t -= weight[n];
if (t < 0) return n;
}
Если вы постоянно выбираете из того же массива,Возможно, вы захотите предварительно вычислить частичные суммы и выполнить бинарный поиск по ним.
Если ваш массив состоит из чисел из диапазона, значительно меньшего его длины, вы можете адаптировать идею подсчета сортировки, т.е. предварительно вычислить частичные суммыкаждый отдельный номер и выполнить бинарный поиск по ним.
Довольно легко увидеть, что, если у вас нет предварительных знаний о числах или весах, вам нужно будет посмотреть на вескаждого числа (потому что он может затмить все остальные веса), поэтому общий алгоритм должен принимать не менее O (n).
Однако дополнительные ограничения позволяют более эффективные реализации.Если вы знаете достаточно маленькую верхнюю границу веса числа, вы можете сделать A / R-выборку:
int[] numbers;
int[] weight;
int maxWeight;
Random r = new Random();
do {
c = numbers[r.nextInt(numbers.length)];
} while (r.nextInt(maxWeight) > weight[c]);
return c;