Apa yang kita pelajari dari buku?
Cara yang paling jelas dan intuitif adalah dengan menghasilkan angka acak di Java dengan panggilan sederhana:
java.lang.math.random ()
Dalam semua bahasa lain, menghasilkan angka acak seperti menggunakan kelas alat matematika seperti ABS, POW, Lantai, SQRT dan fungsi matematika lainnya. Kebanyakan orang belajar tentang kategori ini melalui buku, tutorial, dan kursus. Contoh sederhana: Angka titik mengambang presisi ganda dapat dihasilkan dari 0,0 hingga 1,0. Kemudian melalui informasi di atas, pengembang ingin menghasilkan angka titik mengambang presisi ganda antara 0,0 dan 10,0 dan menulisnya seperti ini:
Math.random () * 10
Jika bilangan bulat antara 0 dan 10 dihasilkan, itu akan ditulis sebagai:
Math.round (Math.Random () * 10)
Canggih
Dengan membaca kode sumber math.random (), atau hanya menggunakan fungsi penyelesaian otomatis IDE, pengembang dapat dengan mudah menemukan bahwa java.lang.math.random () menggunakan objek yang dihasilkan secara acak secara internal - objek yang sangat kuat dapat fleksibel secara acak fleksibel Generasi: Nilai boolean, semua jenis numerik, dan bahkan distribusi Gaussian. Misalnya:
baru java.util.random (). nextint (10)
Ini memiliki kerugian, yaitu, itu adalah objek. Metodenya harus dipanggil melalui contoh, yang berarti konstruktornya harus dipanggil terlebih dahulu. Jika ada memori yang cukup, ekspresi seperti yang di atas dapat diterima; tetapi ketika ada memori yang tidak memadai, itu akan menyebabkan masalah.
Solusi sederhana yang dapat menghindari membuat instance baru setiap kali nomor acak adalah menggunakan kelas statis. Anda mungkin memikirkan java.lang.math, sangat baik, kami meningkatkan inisialisasi java.lang.math. Meskipun proyek ini rendah, Anda juga perlu melakukan beberapa tes unit sederhana untuk memastikannya tidak salah.
Dengan asumsi bahwa program perlu menghasilkan nomor acak untuk disimpan, masalahnya muncul lagi. Misalnya, kadang -kadang perlu mengoperasikan atau melindungi benih, dan nomor internal digunakan untuk menyimpan status dan menghitung angka acak berikutnya. Dalam kasus -kasus khusus ini, tidak pantas untuk berbagi objek yang dihasilkan secara acak.
bersamaan
Dalam lingkungan aplikasi multithreaded Java EE, objek instance yang dihasilkan secara acak masih dapat disimpan di kelas atau kelas implementasi lainnya sebagai properti statis. Untungnya, java.util.random aman-utas, jadi tidak ada risiko bahwa beberapa panggilan utas akan menghancurkan benih.
Hal lain yang patut dipertimbangkan adalah contoh multithreaded dari java.lang.threadlocal. Pendekatan malas adalah menerapkan satu contoh melalui Java sendiri API.
Meskipun Java tidak memberikan cara yang baik untuk mengelola satu contoh java.util.random. Namun, Java 7 yang telah lama ditunggu-tunggu menyediakan cara baru untuk menghasilkan angka acak:
java.util.concurrent.threadlocalrandom.current (). NextInt (10)
API baru ini menggabungkan keunggulan dari dua pendekatan lain: contoh tunggal/akses statis, sefleksibel Math.random (). Threadlocalrandom juga lebih cepat daripada cara lain untuk menangani konkurensi tinggi.
pengalaman
Chris Marasti-Georg menunjukkan:
Math.round (Math.Random () * 10)
Jadikan distribusi tidak seimbang, misalnya: 0,0 - 0,499999 akan membulatkan ke 0, sedangkan 0,5 hingga 1,4999999 akan membulatkan ke 1. Jadi cara menggunakan sintaks gaya lama untuk mencapai distribusi seimbang yang benar, sebagai berikut:
Math.floor (Math.Random () * 11)
Untungnya, jika kita menggunakan java.util.random atau java.util.concurrent.threadlocalrandom, kita tidak perlu khawatir tentang hal di atas.
Proyek Praktis Java memperkenalkan beberapa kerugian secara tidak benar menggunakan Java.util.random API. Pelajaran ini memberitahu kita untuk tidak menggunakan:
Math.abs (rnd.nextInt ())%n
Dan gunakan:
rnd.nextint (n)
Y di atas adalah pengantar terkait dengan nomor acak di java, dan saya harap ini akan membantu untuk pembelajaran semua orang.