يصف المثال الموجود في هذه المقالة طريقة تنفيذ الوزن العشوائي في Java. شاركها مع الجميع لتكون مرجعا لك. التحليل المحدد هو كما يلي:
غالبًا ما يتم استخدام الترجيح العشوائي في المشاريع، لذلك قمت بتلخيصه في فئة الأدوات.
هناك عمومًا طريقتان لتنفيذ الأوزان العشوائية:
1. استخدم مصفوفة لتخزين الهدف الفعلي المطابق للوزن، على سبيل المثال، وزن A هو 2 ووزن B هو 3. ثم يكون طول المصفوفة 5. أول اثنين من المصفوفة يخزنان A و. آخر ثلاثة متاجر ب.
ثم قم بترتيب رقم عشوائيًا [طول البيانات 0) وأخذ قيمة الحرف المنخفض المقابل للمصفوفة مباشرةً.
المزايا: بنية بيانات بسيطة، خوارزمية فعالة، تنفيذ بسيط
العيوب: عندما تكون قيمة الوزن كبيرة نسبيًا ويوجد الكثير من البيانات، سيتم إهدار الذاكرة.
2. استخدم خوارزمية الفاصل الزمني، وقم بتركيب الأوزان من الأمام إلى الخلف، ثم قم بتعيين رقم عشوائيًا [مجموع وزن واحد]، ثم استخدم الوزن العشوائي لطرح وزن كل عنصر بدوره عندما يكون العنصر الأول أقل من أو يساوي 0 هو عناصر البحث لدينا
يمكن لهذا التطبيق استعارة طريقة البحث الثنائي للمصفوفات.
انقر هنا لتحميل رمز المثال الكامل.
الصق الكود:
وييت ميتا جافا:
انسخ رمز الكود كما يلي:/**
* يوصى باستخدام فئة RandomUtil لإنشاء كائنات RandomMeta
* @author wxf بتاريخ 14-5-5.
*/
الفئة العامة WeightMeta<T> {
نهائي خاص Random run = new Random();
عقد T[] النهائية الخاصة؛
الأوزان النهائية الخاصة [] ؛
نهائي خاص int maxW؛
الوزن العام العام (T[] العقد، int[] الأوزان) {
this.nodes = العقد;
this.weights = الأوزان؛
this.maxW = الأوزان[weights.length - 1];
}
/**
* تقوم هذه الطريقة بإرجاع كائن عشوائي مرجح
* @يعود
*/
عام T عشوائي () {
int Index = Arrays.binarySearch(weights, ran.nextInt(maxW) + 1);
إذا (الفهرس <0) {
الفهرس = -1 - الفهرس؛
}
عقد العودة [الفهرس]؛
}
عامة T عشوائية (int ranInt) {
إذا (رانينت> ماكسو) {
ranInt = maxW;
} وإلا إذا (ranInt < 0) {
ranInt = 1;
} آخر {
ranInt++;
}
int Index = Arrays.binarySearch(weights, ranInt);
إذا (الفهرس <0) {
الفهرس = -1 - الفهرس؛
}
عقد العودة [الفهرس]؛
}
@تجاوز
سلسلة عامة إلى سلسلة () {
StringBuilder l1 = new StringBuilder();
StringBuilder l2 = new StringBuilder("[random]/t");
StringBuilder l3 = new StringBuilder("[node]/t/t");
l1.append(this.getClass().getName()).append(":":).append(this.hashCode()).append(":/n").append("[index]/t/t ");
لـ (int i = 0; i <weights.length; i++) {
l1.append(i).append("/t");
l2.append(الأوزان[i]).append("/t");
l3.append(nodes[i]).append("/t");
}
l1.append("/n");
l2.append("/n");
l3.append("/n");
إرجاع 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(map);
* وزن السلسلة RandomUrl = md.random();
*
* </pre></blockquote><p>
*
* @author wxf بتاريخ 14-5-5.
*/
الطبقة العامة RandomUtil {
عام ثابت <T> WeightMeta<T> buildWeightMeta(final Map<T, Integer>weightMap) {
الحجم النهائي النهائي = WeightMap.size();
Object[] العقد = new Object[size];
int[]weights = new int[size];
مؤشر كثافة العمليات = 0؛
intweightAdder = 0;
لـ (Map.Entry<T, Integer> every :weightMap.entrySet()) {
العقد[index] = every.getKey();
الأوزان[index++] = (weightAdder =weightAdder + every.getValue());
}
إرجاع عقد WeightMeta<T>((T[]) جديدة وأوزان);
}
}
آمل أن تكون هذه المقالة مفيدة لبرمجة جافا للجميع.