Cara Menghasilkan Angka Acak di Java
โก Ringkasan Cerdas
Angka acak dalam Java berasal dari empat opsi pustaka standar yang saling terkait, yaitu kelas Random, Math.random, ThreadLocalRandom, dan SecureRandom, yang masing-masing mencakup kombinasi kecepatan, keamanan thread, dan kekuatan kriptografi yang berbeda untuk aplikasi nyata.

Angka acak muncul di mana-mana JavaMulai dari data uji unit dan permainan lempar dadu hingga token sesi dan tumpukan kartu yang dikocok. Tutorial ini menjelaskan cara menghasilkan angka acak di Java Menggunakan setiap opsi dalam pustaka standar dan cara memilih opsi yang tepat untuk pekerjaan tersebut.
Hasilkan Angka Acak di Java
The Java Pustaka standar menawarkan empat cara umum untuk menghasilkan angka acak:
java.util.Randomadalah kelas serbaguna. Kelas ini menghasilkan nilai boolean, int, long, float, dan double melalui metode-metode sepertinextInt,nextLong, dannextDouble.Math.randomadalah helper statis yang mengembalikan nilai double antara 0.0 (inklusif) dan 1.0 (eksklusif) menggunakan shared.Randomsecara internal.ThreadLocalRandominjava.util.concurrentmemberikan setiap thread generatornya sendiri, sehingga beberapa thread tidak berebut satu instance yang sama.SecureRandominjava.securityMenghasilkan angka pseudo-acak yang kuat secara kriptografis untuk kata sandi, pengenal sesi, dan kunci.
Bagian di bawah ini menunjukkan cara menghasilkan sepuluh angka acak dengan setiap pendekatan.
Contoh: Menghasilkan Angka Acak Menggunakan Java Kelas Acak
Contoh pertama menggunakan java.util.Random untuk menghasilkan sepuluh bilangan bulat dalam rentang 0 hingga 99 (termasuk):
import java.util.Random; public class RandomNumbers { public static void main(String[] args) { Random objGenerator = new Random(); for (int iCount = 0; iCount < 10; iCount++) { int randomNumber = objGenerator.nextInt(100); System.out.println("Random No : " + randomNumber); } } }
Keluaran:
Random No : 17 Random No : 57 Random No : 73 Random No : 48 Random No : 68 Random No : 86 Random No : 34 Random No : 97 Random No : 73 Random No : 18
Sebuah contoh dari Random diciptakan sebagai objGenerator. itu nextInt(int bound) Metode ini mengembalikan nilai antara 0 (inklusif) dan batas yang diberikan (eksklusif), jadi nextInt(100) menghasilkan nilai dari 0 hingga 99. Untuk membuat urutan tersebut dapat direproduksi, berikan nilai awal (seed) ke konstruktor, misalnya new Random(42); benih yang sama selalu menghasilkan urutan yang sama, yang berguna dalam pengujian dan simulasi.
Contoh: Menggunakan Java Matematika.acak
Untuk menghasilkan sepuluh nilai acak dalam rentang 0.0 hingga 1.0, panggil fungsi statis tersebut. Math.random metode di dalam lingkaranIni adalah cara tercepat untuk mendapatkan nilai double acak tanpa membuat objek generator:
public class DemoRandom { public static void main(String[] args) { for (int xCount = 0; xCount < 10; xCount++) { System.out.println(Math.random()); } } }
Keluaran:
0.46518450373334297 0.14859851177803485 0.5628391820492477 0.6323378498048606 0.1740198445692248 0.9140544122258946 0.9167350036262347 0.49251219841030147 0.7426056725722353 0.2039418871298877
Dibawah tenda, Math.random membuat satu statis Random pada penggunaan pertama dan panggilan nextDouble di atasnya. Generator bersama tunggal itu bagus untuk demo tetapi menjadi hambatan di bawah beban multithreading yang berat, yang akan dibahas di bagian selanjutnya.
Menghasilkan Angka Acak dalam Rentang Kustom
Program sungguhan biasanya membutuhkan nilai acak dalam rentang tertentu, seperti bilangan bulat antara 1 dan 6 untuk lemparan dadu atau bilangan desimal antara 10.0 dan 20.0 untuk simulasi. Dua pola mencakup hampir setiap kasus.
Bilangan bulat acak antara nilai minimum dan maksimum (termasuk):
import java.util.Random; public class RangeDemo { public static void main(String[] args) { Random rnd = new Random(); int min = 1; int max = 6; // nextInt(max - min + 1) returns 0..(max-min), then shift by min int dice = rnd.nextInt(max - min + 1) + min; System.out.println("Dice roll : " + dice); } }
Nilai acak ganda antara nilai minimum dan maksimum:
double min = 10.0; double max = 20.0; double value = min + (max - min) * Math.random(); System.out.println("Value : " + value);
Kedua pola tersebut bekerja dengan mengambil nilai dari rentang asli generator, menskalakannya ke lebar rentang target, dan menggesernya ke atas dengan nilai minimum. Jika Anda sedang menggunakan Java Pada versi 8 atau yang lebih baru, hasil yang sama tersedia melalui versi yang lebih baru. ints, longs, dan doubles metode aliran pada Random, sebagai contoh rnd.ints(10, 1, 7).forEach(System.out::println) untuk sepuluh lemparan dadu.
ThreadLocalRandom untuk Multithreaded Code
Satu unit yang digunakan bersama Random Meskipun aman untuk multi-threading, metode ini lambat saat terjadi persaingan antar thread karena setiap thread harus melakukan sinkronisasi pada seed internal yang sama. ThreadLocalRandom, ditambahkan dalam Java 7 dan tinggal di java.util.concurrent, memberikan setiap thread generatornya sendiri sehingga tidak ada perebutan kunci.
import java.util.concurrent.ThreadLocalRandom; public class ThreadLocalDemo { public static void main(String[] args) { // random int in [1, 100] int i = ThreadLocalRandom.current().nextInt(1, 101); // random long in [1000, 5000] long l = ThreadLocalRandom.current().nextLong(1000L, 5001L); // random double in [0.0, 1.0) double d = ThreadLocalRandom.current().nextDouble(); System.out.println(i + " " + l + " " + d); } }
penggunaan ThreadLocalRandom.current() di dalam thread pekerja, aliran paralel, dan tugas konkuren apa pun. Perhatikan bahwa setSeed melempar UnsupportedOperationException, jadi pemberian nilai awal untuk reproduksi tidak didukung; jika Anda membutuhkan nilai awal tetap, tetap gunakan nilai awal biasa. Random.
SecureRandom untuk Nilai Acak yang Sensitif terhadap Keamanan Numbers
Contoh-contoh dari Random ke ThreadLocalRandom tidak aman secara kriptografis. Dengan beberapa sampel keluaran, penyerang dapat merekonstruksi keadaan internal dan memprediksi nilai di masa mendatang. Untuk kata sandi, token sesi, nilai salt, dan kunci kriptografis, gunakan java.security.SecureRandom Sebaliknya, ia mengambil materi awal dari kumpulan entropi sistem operasi dan menghasilkan nilai-nilai yang sulit diprediksi.
import java.security.SecureRandom; public class SecureDemo { public static void main(String[] args) { SecureRandom secure = new SecureRandom(); byte[] token = new byte[16]; secure.nextBytes(token); // 128-bit random token int otp = secure.nextInt(1_000_000); // 6-digit one-time code System.out.println("OTP : " + String.format("%06d", otp)); } }
SecureRandom lebih lambat dari Random Karena menggunakan algoritma yang lebih kuat dan materi awal yang lebih kaya. Simpan untuk pekerjaan keamanan dan gunakan generator yang lebih cepat untuk game, simulasi, dan data uji.
