1. Definisi Masalah:
Tanyakan array. Persimpangan
Misalnya:
Salin kode kode sebagai berikut:
Berat: 8 2 11 79
Nilai yang dikembalikan oleh berat: 0 1 2 3
2. Analisis masalah:
Ide 1: Buat array dengan ukuran dan berat ukuran dan berat. Kategori didorong secara berurutan.
Kemudian gunakan jumlah berat dan ukuran acak untuk menghasilkan angka acak. Kerugian harus terlalu menempati memori.
Ide 2:
Berat dan array w [i] Simpan kompleksitas berat dan waktu dari semua elemen [0, i].
Acak [0, w [399]]] Lihat waktu mana angka acak jatuh di mana kompleksitas waktu o (longn)
Jadi kompleksitas kompleksitas waktu total o (n) kompleksitas spasial o (n)
Pseudocode:
Perjudian yang berputar bukanlah pilihan yang sangat baik, tetapi mudah dicapai.
Pertama -tama, perlu untuk memahami bahwa karena silang -dan -dan operator lainnya, arah evolusi tidak dapat dikendalikan, sehingga tanggung jawab evolusi yang berat adalah pada operator seleksi.
Jika Anda memahami ini, mudah dilakukan.
Perjudian yang berputar adalah untuk mengumpulkan probabilitas untuk mencapainya.
Jika: FIT adalah adaptasi dari array, kode kode copy total adalah sebagai berikut:
untuk i = 1 ke m '
Jumlah = jumlah+fit (i)
Selanjutnya saya
Untuk i = 1 hingga n 'n- berapa banyak orang yang ingin Anda hasilkan?
Temp = temp + fit (i)
Jika rnd <= temp / s
Output i adalah hasilnya
Fungsi keluar
Akhiri jika
Selanjutnya saya
Ketiga, selesaikan masalahnya:
Salin kode kode sebagai berikut:
paket data;
Impor java.util.hashmap;
Impor java.util.map;
/**
Nomor acak berat:
Jika berat: 8 2 11 79
Nilai yang dikembalikan oleh berat: 0 1 2 3
@Author Ajian005 [email protected]
2014-2-16 21:12
Hasil Output: {2.0 = 184128, 11.0 = 348551, 79.0 = 1308100, 8.0 = 159221}}
*/
kelas publik weighttrandomtest {
Private static double [] weightArrays = {8.0, 2.0, 11.0.79.0};
Public static void main (string [] args) {{{{{{{{
Weighttrandom weighttrandom = weightrandom baru ();
Peta <double, integer> stat = new HashMap <double, integer> ();
untuk (int i = 0; i <2000000; i ++) {
Int WeightValue = weighttrandom.getweightrandom (WeightArrays);
if (bobotvalue <0) {{
melanjutkan;
}
System.out.println ("Nomor acak dikembalikan berdasarkan berat:" + WeightValue);
if (stat.get (weightArrays [bobotValue]) == null) {
Stat.put (weightArrays [WeightValue], 1);
} Kalau tidak {
stat.put (weightArrays [WeightValue], Stat.get (WeightArrays [WeightValue])+1);
}
}
System.out.println (stat);
}
}
kelas weighttrandom {
java.util.random r = new java.util.random ();
Private double weightArraysum (double [] weightArrays) {{
bobot ganda = 0;
Untuk (double weightvalue: weightArrays) {
Bobotsum += nilai berat;
}
Return Weightsum;
}
Public int getweightrandom (double [] weightArrays) {{
Double Weightsum = WeightArraysum (WeightArrays);
Double Step WeightSum = 0;
untuk (int i = 0; i <weightarrays.length; i ++) {
Step WeightSum += WeightArrays [i];
if (math.random () <= step weightsum/weightsum) {
//System.out.println (i);
Kembalikan i;
}
}
System.out.println ("Kesalahan");
Kembali -1;
}
}
Keempat, ringkasan ringkasan:
Perjudian putaran Rusia adalah untuk mengakumulasi probabilitas untuk mencapai
Penjadwalan beban dependen, dll.