Contoh dalam artikel ini menjelaskan metode implementasi bobot acak di Java. Bagikan dengan semua orang untuk referensi Anda. Analisis spesifiknya adalah sebagai berikut:
Pembobotan acak sering digunakan dalam proyek, jadi saya mengabstraksikannya ke dalam kelas alat.
Umumnya ada dua cara untuk menerapkan bobot acak:
1. Gunakan array untuk menyimpan target sebenarnya yang sesuai dengan bobotnya. Misalnya, bobot A adalah 2 dan bobot B adalah 3. Maka panjang array adalah 5. Dua array pertama menyimpan A dan tiga toko terakhir B.
Kemudian mengacak angka [0-panjang data) dan langsung mengambil nilai subskrip array yang sesuai.
Keuntungan: struktur data sederhana, algoritma efisien, implementasi sederhana
Kekurangan: Jika nilai bobotnya relatif besar dan datanya banyak, memori akan terbuang sia-sia.
2. Gunakan algoritma interval, letakkan bobot dari depan ke belakang, lalu tetapkan angka secara acak [jumlah 1 bobot], lalu gunakan bobot acak untuk mengurangi bobot setiap elemen secara bergantian ketika elemen pertama kurang dari atau sama dengan 0 adalah elemen Temukan kami
Implementasi ini dapat meminjam metode Array binerSearch.
Klik di sini untuk mengunduh contoh kode lengkap.
Tempelkan kode:
BeratMeta.java:
Copy kode kodenya seperti berikut:/**
* Disarankan untuk menggunakan kelas RandomUtil untuk membuat objek RandomMeta
* @penulis wxf pada 14-5-5.
*/
kelas publik WeightMeta<T> {
private final Random run = new Random();
simpul T[] akhir pribadi;
bobot int[] final pribadi;
int akhir pribadi maxW;
public WeightMeta(T[] node, int[] bobot) {
this.nodes = node;
this.weights = bobot;
this.maxW = bobot[bobot.panjang - 1];
}
/**
* Metode ini mengembalikan objek acak berbobot
* @kembali
*/
publik T acak() {
int indeks = Arrays.binarySearch(bobot, ran.nextInt(maxW) + 1);
jika (indeks < 0) {
indeks = -1 - indeks;
}
kembalikan node[indeks];
}
publik T acak(int ranInt) {
jika (ranInt > maxW) {
ranInt = maxW;
} lain jika(ranInt < 0){
ranInt = 1;
} kalau tidak {
ranInt++;
}
int indeks = Arrays.binarySearch(bobot, ranInt);
jika (indeks < 0) {
indeks = -1 - indeks;
}
kembalikan node[indeks];
}
@Mengesampingkan
String publik keString() {
StringBuilder l1 = StringBuilder baru();
StringBuilder l2 = new StringBuilder("[acak]/t");
StringBuilder l3 = new StringBuilder("[simpul]/t/t");
l1.append(ini.getClass().getName()).append(":").append(ini.hashCode()).append(":/n").append("[index]/t/t ");
for (int i = 0; i < bobot.panjang; i++) {
l1.append(i).append("/t");
l2.append(bobot[i]).append("/t");
l3.append(node[i]).append("/t");
}
l1.tambahkan("/n");
l2.tambahkan("/n");
l3.tambahkan("/n");
kembalikan l1.append(l2).append(l3).toString();
}
}
RandomUtil.java:
Copy kode kodenya seperti berikut:/**
* Alat acak
*
* Gunakan Peta koleksi berbobot untuk membuat objek metadata acak
*
* Misalnya:
* Kami memiliki 3 alamat url, bobotnya 1, 2, dan 3. Sekarang kami menggunakan RandomUtil untuk mendapatkan url secara acak berdasarkan bobotnya:
*
* <p><blockquote><pre>
*
* peta.put(url1, 1);
* peta.put(url2, 2);
* peta.put(url3, 3);
* RandomMeta<String, Integer> md = RandomUtil.buildWeightMeta(peta);
* String bobotRandomUrl = md.random();
*
* </pre></blockquote><p>
*
* @penulis wxf pada 14-5-5.
*/
kelas publik RandomUtil {
public static <T> WeightMeta<T> buildWeightMeta(Peta akhir<T, Integer> WeightMap) {
ukuran int akhir = WeightMap.size();
Objek[] node = Objek[ukuran] baru;
int[] bobot = int[ukuran] baru;
int indeks = 0;
int penambah berat = 0;
for (Map.Entry<T, Integer> masing-masing : WeightMap.entrySet()) {
node[indeks] = masing-masing.getKey();
bobot[index++] = (weightAdder = WeightAdder + masing-masing.getValue());
}
mengembalikan node WeightMeta<T>((T[]) baru, bobot);
}
}
Saya harap artikel ini bermanfaat untuk pemrograman Java semua orang.