Kelas acak (java.util)
Algoritma acak yang diimplementasikan di kelas acak adalah pseudo-acak, yaitu acak dengan aturan. Saat melakukan pengacakan, jumlah asal algoritma acak disebut biji, yang melakukan transformasi tertentu berdasarkan pada biji, sehingga menghasilkan angka acak yang diperlukan.
Objek acak dengan jumlah biji yang sama, angka acak yang dihasilkan oleh jumlah kali yang sama persis sama. Dengan kata lain, untuk dua objek acak dengan nomor benih yang sama, angka acak yang dihasilkan untuk pertama kalinya persis sama, dan angka acak yang dihasilkan untuk kedua kalinya persis sama. Ini membutuhkan perhatian khusus saat menghasilkan banyak angka acak.
Berikut ini menggambarkan penggunaan kelas acak, serta cara menghasilkan array acak dari interval yang ditentukan dan peluang yang diperlukan dalam program implementasi.
1. Generasi objek acak
Kelas acak berisi dua konstruktor, yang diperkenalkan secara berurutan di bawah ini:
A. acak publik ()
Metode konstruksi ini menggunakan angka yang terkait dengan waktu relatif yang sesuai dengan waktu sistem saat ini sebagai nomor benih, dan kemudian menggunakan nomor benih ini untuk membangun objek acak.
B. Random Publik (Benih Panjang)
Konstruktor ini dapat dibuat dengan merumuskan nomor benih.
Kode contoh:
Salinan kode adalah sebagai berikut:
Acak r = acak baru ();
Acak r1 = acak baru (10);
Sekali lagi: Jumlah biji hanyalah jumlah asal dari algoritma acak dan tidak ada hubungannya dengan interval angka acak yang dihasilkan.
2. Metode umum di kelas acak
Metode dalam kelas acak relatif sederhana, dan fungsi masing -masing metode juga mudah dipahami. Perlu dicatat bahwa angka acak yang dihasilkan oleh setiap metode di kelas acak terdistribusi secara seragam, yang berarti bahwa probabilitas generasi numerik dalam interval adalah sama. Berikut adalah pengantar dasar untuk metode ini:
A. Public Boolean NextBoolean ()
Fungsi metode ini adalah untuk menghasilkan nilai boolean acak, dan probabilitas menghasilkan nilai benar dan salah adalah sama, yaitu, keduanya 50%.
B. double nextdouble publik ()
Tujuan dari metode ini adalah untuk menghasilkan nilai ganda acak, dengan nilai antara [0, 1.0).
C, int nextint publik ()
Tujuan dari metode ini adalah untuk menghasilkan nilai int acak, yaitu antara -231 dan 231-1.
Jika Anda perlu menghasilkan nilai int untuk interval tertentu, Anda perlu melakukan transformasi matematika tertentu. Untuk detailnya, silakan merujuk ke kode dalam contoh penggunaan di bawah ini.
D, int nextint publik (int n)
Fungsi metode ini adalah untuk menghasilkan nilai int acak, yang berada dalam interval [0, n), yaitu, nilai int acak antara 0 dan n, yang mengandung 0 tetapi tidak n.
Jika Anda ingin menghasilkan nilai int untuk interval tertentu, Anda juga perlu melakukan transformasi matematika tertentu. Untuk detailnya, silakan merujuk ke kode dalam contoh penggunaan di bawah ini.
E, setseed public void (biji panjang)
Tujuan dari metode ini adalah untuk mengatur ulang jumlah benih dalam objek acak. Setelah mengatur jumlah biji, objek acak sama dengan objek acak yang dibuat dengan kata kunci baru.
3. Contoh Penggunaan Kelas Acak
Menggunakan kelas acak, umumnya menghasilkan angka acak untuk interval yang ditentukan. Berikut ini akan memperkenalkan cara menghasilkan angka acak untuk interval yang sesuai satu per satu. Kode berikut yang menghasilkan angka acak dihasilkan menggunakan objek acak berikut r:
Acak r = acak baru ();
A. Menghasilkan desimal interval [0, 1.0)
Salinan kode adalah sebagai berikut:
Double D1 = R.NextDouble ();
Ini diperoleh secara langsung menggunakan metode NextDouble.
B. Menghasilkan desimal interval [0,5.0)
Salinan kode adalah sebagai berikut:
double d2 = r.nextdouble () * 5;
Karena interval angka yang dihasilkan oleh metode NextDouble adalah [0, 1.0), memperluas interval dengan 5 kali adalah interval yang diperlukan.
Demikian pula, untuk menghasilkan desimal acak dalam interval [0, d) dan D adalah desimal positif, Anda hanya perlu melipatgandakan nilai pengembalian metode NextDouble dengan d.
C. Menghasilkan desimal dalam interval [1.2.5)
Salinan kode adalah sebagai berikut:
d3 d3 = r.nextdouble () * 1.5 + 1;
Untuk menghasilkan desimal acak dari interval [1, 2.5) Anda hanya perlu terlebih dahulu menghasilkan jumlah acak interval [0, 1.5) dan kemudian tambahkan 1 ke interval bilangan acak yang dihasilkan.
Demikian pula, untuk menghasilkan angka acak dalam kisaran interval desimal [D1, D2) yang tidak dimulai dari 0 (di mana D1 tidak sama dengan 0), Anda hanya perlu menghasilkan angka acak terlebih dahulu dalam interval [0, D2-D1) dan kemudian menambahkan interval angka acak yang dihasilkan ke D1.
D. Menghasilkan bilangan bulat
Salinan kode adalah sebagai berikut:
int n1 = r.nextInt ();
Cukup gunakan metode NextInt secara langsung.
e. Menghasilkan bilangan bulat dalam interval [0,10)
Salinan kode adalah sebagai berikut:
int n2 = r.nextint (10);
n2 = math.abs (r.nextInt () % 10);
Dua baris kode di atas dapat menghasilkan bilangan bulat dalam interval [0,10).
Implementasi pertama diterapkan secara langsung menggunakan metode NextInt (int n) di kelas acak.
Dalam implementasi kedua, metode panggilan pertama nextInt () untuk menghasilkan nomor int yang sewenang -wenang. Interval yang dihasilkan oleh jumlah jumlah 10 adalah (-10,10), dan kemudian menemukan nilai absolut dari interval, dan interval yang diperoleh adalah [0,10).
Demikian pula, untuk menghasilkan bilangan bulat acak dalam interval apa pun [0, n) Anda dapat menggunakan kode berikut:
Salinan kode adalah sebagai berikut:
int n2 = r.nextint (n);
n2 = math.abs (r.nextint () % n);
F. Menghasilkan bilangan bulat dalam interval [0,10]
Salinan kode adalah sebagai berikut:
int n3 = r.nextint (11);
n3 = math.abs (r.nextint () % 11);
Dibandingkan dengan interval integer, interval [0,10] dan interval [0,11) setara, sehingga integer interval [0,11) dihasilkan.
G. Menghasilkan bilangan bulat dalam interval [-3,15)
Salinan kode adalah sebagai berikut:
int n4 = r.nextint (18) - 3;
n4 = math.abs (r.nextint () % 18) - 3;
Untuk menghasilkan bilangan bulat acak yang tidak dimulai dari 0, Anda dapat merujuk pada deskripsi di atas dari prinsip implementasi interval desimal yang tidak dimulai dari 0.
h, kesempatan untuk mencapai
Menerapkan logika program sesuai dengan peluang tertentu juga merupakan masalah yang dapat diselesaikan dengan pemrosesan acak. Berikut adalah contoh sederhana untuk menunjukkan cara mengimplementasikan logika peluang menggunakan angka acak.
Dalam metode sebelumnya PENDAHULUAN, angka yang dihasilkan dalam metode NextInt (int n) seragam, yaitu, kemungkinan pembuatan setiap angka dalam interval adalah sama. Kemudian jika bilangan bulat acak dalam interval [0,100) dihasilkan, peluang setiap angka yang dihasilkan harus sama, dan karena ada 100 bilangan bulat dalam interval, peluang setiap angka adalah 1%. Menurut teori ini, masalah probabilitas dalam program dapat direalisasikan.
Contoh: Secara acak menghasilkan bilangan bulat yang menghasilkan 1 dengan peluang 55%, 2 dengan peluang 40%, dan 3 dengan peluang 5%. Kode yang diimplementasikan adalah sebagai berikut:
Salinan kode adalah sebagai berikut:
int n5 = r.nextint (100);
int m; // Nomor Hasil
if (n5 <55) {// interval 55 angka, peluang 55%
m = 1;
} lain jika (n5 <95) {// [55,95), interval 40 angka, 40% peluang
m = 2;
}kalau tidak{
m = 3;
}
Karena probabilitas setiap angka adalah 1%, probabilitas interval 55 digit adalah 55%. Untuk kenyamanan menulis kode, semua bilangan bulat dalam interval [0,55) digunakan di sini, dan prinsip selanjutnya adalah sama.
Tentu saja, kode di sini dapat disederhanakan karena kemungkinan kelipatan 5%, jadi cukup kendalikan peluang berdasarkan 5%. Berikut ini adalah implementasi kode yang disederhanakan:
Salinan kode adalah sebagai berikut:
int n6 = r.nextint (20);
int m1;
if (n6 <11) {
M1 = 1;
} lain jika (n6 <19) {
M1 = 2;
}kalau tidak{
M1 = 3;
}
Di dalam program, logika probabilitas dapat diimplementasikan sesuai dengan instruksi di atas.
4. Masalah lainnya
A. Masalah objek acak dengan nomor benih yang sama
Seperti disebutkan sebelumnya, objek acak dengan jumlah biji yang sama memiliki angka acak yang sama yang dihasilkan oleh jumlah kali yang sama. Berikut ini adalah kode uji:
Salinan kode adalah sebagai berikut:
Acak r1 = acak baru (10);
Acak r2 = acak baru (10);
untuk (int i = 0; i <2; i ++) {
System.out.println (r1.nextInt ());
System.out.println (r2.nextInt ());
}
Dalam kode ini, jumlah benih yang digunakan oleh objek R1 dan R2 adalah 10, sehingga angka acak yang dihasilkan oleh jumlah kali yang sama persis sama.
Jika Anda ingin menghindari situasi di mana angka acak sama, Anda perlu mencatat bahwa tidak peduli berapa banyak angka acak yang perlu Anda hasilkan dalam proyek, Anda hanya dapat menggunakan satu objek acak.
B. Tentang metode acak di kelas matematika
Bahkan, ada juga metode acak di kelas matematika. Pekerjaan metode acak ini adalah menghasilkan desimal acak dari interval [0, 1.0).
Dengan membaca kode sumber kelas matematika, kita dapat menemukan bahwa metode acak di kelas matematika diimplementasikan dengan secara langsung memanggil metode NextDouble di kelas acak.
Hanya saja metode acak disebut relatif sederhana, sehingga banyak programmer terbiasa menggunakan metode acak kelas matematika untuk menghasilkan angka acak.