Пример в этой статье описывает реализацию метода случайного веса в Java. Поделитесь этим со всеми для справки. Конкретный анализ заключается в следующем:
В проектах часто используется случайное взвешивание, поэтому я выделил его в класс инструментов.
Обычно существует два способа реализации случайных весов:
1. Используйте массив для хранения фактической цели, соответствующей весу. Например, вес A равен 2, а вес B равен 3. Тогда длина массива равна 5. Первые два массива хранят A и. последние три магазина Б.
Затем рандомизируйте число (длина данных 0) и напрямую возьмите значение соответствующего индекса массива.
Преимущества: простая структура данных, эффективный алгоритм, простая реализация.
Недостатки: Когда значение веса относительно велико и данных много, память будет расходоваться впустую.
2. Используйте интервальный алгоритм, наложите веса спереди назад, затем случайным образом присвойте число [сумма 1 веса], а затем используйте случайный вес для вычитания веса каждого элемента по очереди, когда первый элемент меньше или. равное 0 — это наши элементы Find
Эта реализация может заимствовать методbinarySearch из Arrays.
Нажмите здесь, чтобы загрузить полный пример кода.
Вставьте код:
ВесМета.java:
Скопируйте код кода следующим образом:/**
* Для создания объектов RandomMeta рекомендуется использовать класс RandomUtil.
* @author wxf 14.05.05.
*/
общественный класс WeightMeta<T> {
частный окончательный случайный запуск = новый Random();
частные конечные узлы T[];
частные окончательные веса int[];
частный финал int maxW;
public WeightMeta(узлы T[], веса int[]) {
this.nodes = узлы;
this.weights = веса;
this.maxW = веса [веса.длина - 1];
}
/**
* Этот метод возвращает взвешенный случайный объект.
* @возвращаться
*/
общественный Т случайный () {
int index = Arrays.binarySearch(weights, ran.nextInt(maxW) + 1);
если (индекс <0) {
индекс = -1 - индекс;
}
вернуть узлы[индекс];
}
общественный T случайный (int ranInt) {
если (ranInt > maxW) {
ранИнт = МаксВ;
} еще если(ranInt <0){
ранИнт = 1;
} еще {
ранИнт++;
}
int index = Arrays.binarySearch(weights, ranInt);
если (индекс <0) {
индекс = -1 - индекс;
}
вернуть узлы[индекс];
}
@Override
публичная строка toString() {
StringBuilder l1 = новый StringBuilder();
StringBuilder l2 = новый StringBuilder("[random]/t");
StringBuilder l3 = новый StringBuilder("[узел]/t/t");
l1.append(this.getClass().getName()).append(":").append(this.hashCode()).append(":/n").append("[index]/t/t ");
for (int i = 0; i <weights.length; i++) {
l1.append(i).append("/t");
l2.append(weights[i]).append("/t");
l3.append(nodes[i]).append("/t");
}
l1.append("/n");
l2.append("/n");
l3.append("/n");
return l1.append(l2).append(l3).toString();
}
}
RandomUtil.java:
Скопируйте код кода следующим образом:/**
* Случайные инструменты
*
* Используйте взвешенную карту коллекции для создания случайного объекта метаданных.
*
* например:
* У нас есть 3 URL-адреса, их веса — 1, 2 и 3. Теперь мы используем RandomUtil для случайного получения URL-адреса на основе веса:
*
* <p><blockquote><pre>
*
* map.put(url1, 1);
* map.put(url2, 2);
* map.put(url3, 3);
* RandomMeta<String, Integer> md = RandomUtil.buildWeightMeta(карта);
* Строка WeightRandomUrl = md.random();
*
* </pre></blockquote><p>
*
* @author wxf 14.05.05.
*/
общественный класс RandomUtil {
public static <T> WeightMeta<T> buildWeightMeta(final Map<T, Integer> WeightMap) {
окончательный размер int = WeightMap.size();
Узлы объекта [] = новый объект [размер];
int[] веса = новый int[размер];
внутренний индекс = 0;
интервал весаAdder = 0;
for (Map.Entry<T, Integer>each : WeightMap.entrySet()) {
узлы [индекс] = каждый.getKey();
Weights[index++] = (weightAdder = WeightAdder +each.getValue());
}
вернуть новые узлы WeightMeta<T>((T[]), веса);
}
}
Я надеюсь, что эта статья будет полезна каждому, кто занимается программированием на Java.