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.

  • ๐ŸŽฒ Kelas acak: java.util.Random mengekspos nextInt, nextLong, nextDouble, dan nextBoolean untuk tipe data primitif umum.
  • ๐Ÿงฎ Matematika.acak: Math.random mengembalikan nilai double antara 0.0 (inklusif) dan 1.0 (eksklusif) menggunakan instance Random bersama.
  • ๐ŸŽฏ Rentang khusus: Berikan batasan pada nextInt atau skalakan Math.random untuk menghasilkan nilai dalam rentang minimum dan maksimum apa pun.
  • ๐Ÿงต Keamanan benang: ThreadLocalRandom di java.util.concurrent memberikan setiap thread generatornya sendiri dan mengungguli Random bersama dalam kondisi persaingan.
  • ๐Ÿ” Keamanan: SecureRandom dalam java.security menghasilkan nilai-nilai yang kuat secara kriptografis untuk kata sandi, token, dan kunci sesi.
  • ๐ŸŒฑ Reproduksibilitas: Memberikan nilai awal berupa angka panjang tetap pada variabel acak membuat pengujian dan simulasi menjadi deterministik di setiap proses.

Cara Menghasilkan Angka Acak di Java

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.Random adalah kelas serbaguna. Kelas ini menghasilkan nilai boolean, int, long, float, dan double melalui metode-metode seperti nextInt, nextLong, dan nextDouble.
  • Math.random adalah helper statis yang mengembalikan nilai double antara 0.0 (inklusif) dan 1.0 (eksklusif) menggunakan shared. Random secara internal.
  • ThreadLocalRandom in java.util.concurrent memberikan setiap thread generatornya sendiri, sehingga beberapa thread tidak berebut satu instance yang sama.
  • SecureRandom in java.security Menghasilkan 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.

Pertanyaan Umum Demo Slot

Buat instance java.util.Random dan panggil nextInt, nextLong, nextDoubleatau nextBoolean. Untuk solusi cepat satu baris, gunakan Math.random yang mengembalikan nilai double antara 0.0 dan 1.0. Kedua pendekatan ini tersedia di pustaka standar.

Gunakan `random.nextInt(max โ€“ min + 1) + min` untuk bilangan bulat, atau `min + (max โ€“ min) * Math.random()` untuk bilangan desimal. Rumus-rumus tersebut menyesuaikan rentang generator dengan jendela target Anda dan menggesernya berdasarkan nilai minimum.

Random adalah kelas lengkap dengan metode untuk banyak tipe primitif dan mendukung seeding. Math.random adalah helper statis yang mengembalikan nilai double antara 0.0 dan 1.0. Secara internal, Math.random memanggil satu instance Random bersama.

Ya, tetapi panggilan konkuren bersaing untuk mendapatkan seed internal yang sama, yang memperlambat kode yang banyak menggunakan thread. Gunakan ThreadLocalRandom.current() dari java.util.concurrent untuk memberikan setiap thread generatornya sendiri dan menghilangkan persaingan tersebut.

Berikan nilai long tetap ke konstruktor Random, misalnya new Random(42), atau panggil setSeed(42). Generator akan menghasilkan urutan yang sama setiap kali dijalankan, yang sangat penting untuk pengujian dan simulasi yang dapat diulang.

Gunakan SecureRandom setiap kali nilainya harus tahan terhadap prediksi, seperti kata sandi, token sesi, nilai salt, kode sekali pakai, dan kunci kriptografi. Plain Random cepat tetapi mudah diprediksi, sehingga tidak aman untuk pekerjaan keamanan.

Kerangka kerja pembelajaran mesin menggunakan generator pseudo-acak untuk menginisialisasi bobot, mengacak data pelatihan, dan membagi set validasi. Menetapkan nilai awal (seed) membuat eksperimen dapat direproduksi sehingga tim dapat membandingkan hasil model dan men-debug hasilnya dengan andal.

Ya. GitHub Copilot membuat kerangka kode untuk cuplikan Random, ThreadLocalRandom, dan SecureRandom, mencocokkan rumus penskalaan rentang, dan JUnit tes. RevTinjau setiap saran untuk memastikan kelas yang dipilih sesuai dengan kasus penggunaan, terutama untuk kode yang sensitif terhadap keamanan.

Ringkaslah postingan ini dengan: