Rastgele Sayı Nasıl Üretilir? Java

⚡ Akıllı Özet

Rastgele sayılar Java Bu fonksiyonlar, her biri gerçek uygulamalar için hız, iş parçacığı güvenliği ve kriptografik güç açısından farklı bir denge sağlayan, birbiriyle ilişkili dört standart kütüphane seçeneğinden (Random sınıfı, Math.random, ThreadLocalRandom ve SecureRandom) gelmektedir.

  • 🎲 Rastgele sınıf: java.util.Random, nextInt, nextLong ve next fonksiyonlarını sunar.Doubleve yaygın temel veri tipleri için nextBoolean.
  • 🧮 Matematik.rastgele: Math.random, paylaşılan bir Random örneği kullanarak 0.0 (dahil) ile 1.0 (hariç) arasında bir double değer döndürür.
  • 🎯 Özel aralıklar: nextInt'e bir sınır değeri geçirin veya Math.random'ı ölçeklendirerek herhangi bir minimum ve maksimum değer aralığında değerler üretin.
  • 🧵 İplik güvenliği: `java.util.concurrent` içindeki `ThreadLocalRandom`, her iş parçacığına kendi rastgele sayı üretecisini verir ve çekişme durumunda paylaşımlı rastgele sayı üreteciye göre daha iyi performans gösterir.
  • 🔐 Güvenlik: `java.security` paketindeki `SecureRandom` fonksiyonu, parolalar, token'lar ve oturum anahtarları için kriptografik olarak güçlü değerler üretir.
  • 🌱 Yeniden üretilebilirlik: Rastgele bir nesneyi sabit bir uzun değerle başlatmak, testlerin ve simülasyonların çalıştırmalar arasında deterministik olmasını sağlar.

Rastgele Sayı Nasıl Üretilir? Java

Rastgele sayılar her yerde karşımıza çıkıyor. JavaBirim test verilerinden zar atma oyunlarına, oturum belirteçlerinden karıştırılmış destelere kadar birçok alanda rastgele sayılar üretilebileceğini açıklayan bu eğitim, bu alanda rastgele sayıların nasıl oluşturulacağını anlatmaktadır. Java Standart kütüphanedeki her seçeneği kullanma ve işe en uygun olanı seçme yöntemleri.

Rastgele Sayı Üret Java

MKS Java Standart kütüphane, rastgele sayı üretmek için dört yaygın yöntem sunar:

  • java.util.Random Bu, genel amaçlı bir sınıftır. Aşağıdaki gibi yöntemler aracılığıyla boolean, int, long, float ve double değerleri üretir. nextInt, nextLong, ve nextDouble.
  • Math.random Bu, paylaşılan bir veritabanı kullanarak 0.0 (dahil) ile 1.0 (hariç) arasında bir double değer döndüren statik bir yardımcı fonksiyondur. Random içten.
  • ThreadLocalRandom in java.util.concurrent Her iş parçacığına kendi jeneratörünü verir, böylece birden fazla iş parçacığı tek bir örnek üzerinde rekabet etmez.
  • SecureRandom in java.security Parolalar, oturum tanımlayıcıları ve anahtarlar için kriptografik olarak güçlü sözde rastgele sayılar üretir.

Aşağıdaki bölümlerde her bir yaklaşımla on adet rastgele sayı üretmenin nasıl yapılacağı gösterilmektedir.

Örnek: Rastgele Sayı Üretmek İçin Şunu Kullanın: Java Rastgele Sınıf

İlk örnekte şu kullanılıyor: java.util.Random 0 ile 99 arasında (99 dahil) on adet tam sayı üretmek:

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);
        }
    }
}

Çıktı:

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

bir örneği Random şu şekilde oluşturulur: objGenerator. nextInt(int bound) Bu yöntem 0 (dahil) ile belirtilen sınır (hariç) arasında bir değer döndürür, dolayısıyla nextInt(100) 0 ile 99 arasında değerler üretir. Dizinin tekrarlanabilir olmasını sağlamak için, yapıcıya bir başlangıç ​​değeri (seed) iletin, örneğin. new Random(42)Aynı tohum her zaman aynı diziyi üretir; bu da testler ve simülasyonlar için faydalıdır.

Örnek: Kullanma Java Matematik.rastgele

0.0 ile 1.0 aralığında on rastgele değer üretmek için static fonksiyonunu çağırın. Math.random bir yöntemin içinde döngüBu, bir jeneratör nesnesi oluşturmadan rastgele bir double değeri elde etmenin en hızlı yoludur:

public class DemoRandom {
    public static void main(String[] args) {
        for (int xCount = 0; xCount < 10; xCount++) {
            System.out.println(Math.random());
        }
    }
}

Çıktı:

0.46518450373334297
0.14859851177803485
0.5628391820492477
0.6323378498048606
0.1740198445692248
0.9140544122258946
0.9167350036262347
0.49251219841030147
0.7426056725722353
0.2039418871298877

Kaputun altında Math.random tek bir statik oluşturur Random ilk kullanımda ve aramalarda nextDouble Üzerinde durulacak olursak, bu tek paylaşımlı jeneratör demolar için uygundur ancak yoğun çoklu iş parçacığı yükü altında darboğaz haline gelir; sonraki bölümlerde bu konu ele alınacaktır.

Özel bir aralıkta rastgele sayı üretin

Gerçek programlar genellikle belirli bir aralıkta rastgele bir değere ihtiyaç duyar; örneğin, zar atışı için 1 ile 6 arasında bir tamsayı veya simülasyon için 10.0 ile 20.0 arasında bir ondalık sayı. İki model neredeyse her durumu kapsar.

Minimum ve maksimum değerler arasında (dahil) rastgele bir tamsayı:

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);
    }
}

Minimum ve maksimum değerler arasında rastgele çift sayı üretimi:

double min = 10.0;
double max = 20.0;
double value = min + (max - min) * Math.random();
System.out.println("Value : " + value);

Her iki desen de, üretecin doğal aralığından bir değer alarak, bunu hedef aralığın genişliğine göre ölçeklendirip, minimum değer kadar yukarı kaydırarak çalışır. Eğer siz de bu durumdaysanız... Java 8 veya daha sonraki sürümlerde de aynı sonuç daha yeni sürümler aracılığıyla elde edilebilir. ints, longs, ve doubles akış yöntemleri üzerinde RandomÖrneğin, rnd.ints(10, 1, 7).forEach(System.out::println) on zar atışı için.

Çoklu iş parçacıkları için ThreadLocalRandom Code

tek bir paylaşımlı Random Bu yöntem iş parçacıkları açısından güvenlidir ancak her iş parçacığının aynı dahili başlangıç ​​değerine göre senkronize olması gerektiğinden, çekişme altında yavaş çalışır. ThreadLocalRandom, eklendi Java 7 ve orada yaşıyor java.util.concurrentBu, her iş parçacığına kendi jeneratörünü verir, böylece kilit çekişmesi olmaz.

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);
    }
}

Kullanım ThreadLocalRandom.current() Çalışan iş parçacıkları, paralel akışlar ve herhangi bir eşzamanlı görev içinde. Şunu unutmayın ki setSeed atar UnsupportedOperationExceptionDolayısıyla, tekrarlanabilirlik için tohumlama desteklenmiyor; sabit bir tohuma ihtiyacınız varsa, düz olanı kullanın. Random.

Güvenlik Açısından Hassas Rastgele Sayı Üretimi için SecureRandom Numbers

Örnekleri Random hem de ThreadLocalRandom Kriptografik olarak güvenli değillerdir. Birkaç çıktı örneği verildiğinde, bir saldırgan iç durumu yeniden oluşturabilir ve gelecekteki değerleri tahmin edebilir. Parolalar, oturum belirteçleri, tuz değerleri ve kriptografik anahtarlar için şunu kullanın: java.security.SecureRandom Bunun yerine, işletim sisteminin entropi havuzundan başlangıç ​​materyali alır ve tahmine dirençli değerler üretir.

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 daha yavaş Random Çünkü daha güçlü algoritmalar ve daha zengin tohum materyali kullanıyor. Bunu güvenlik çalışmaları için ayırın ve oyunlar, simülasyonlar ve test verileri için daha hızlı jeneratörleri kullanın.

SSS

`java.util.Random` sınıfından bir örnek oluşturun ve `nextInt`, `nextLong` ve `next` metotlarını çağırın.Doubleveya nextBoolean. Hızlı bir tek satırlık işlem için, 0.0 ile 1.0 arasında bir double değer döndüren Math.random'ı kullanın. Her iki yaklaşım da standart kütüphanede mevcuttur.

Tamsayılar için `random.nextInt(max – min + 1) + min` veya ondalık sayılar için `min + (max – min) * Math.random()` formüllerini kullanın. Bu formüller, üreteç aralığını hedef pencerenize göre ölçeklendirir ve minimum değer kadar kaydırır.

Random, birçok temel veri türü için metotlar içeren ve tohumlama desteği sunan tam bir sınıftır. Math.random, 0.0 ile 1.0 arasında bir double değer döndüren statik bir yardımcı fonksiyondur. Dahili olarak, Math.random tek bir paylaşılan Random örneğini çağırır.

Evet, ancak eşzamanlı çağrılar aynı dahili başlangıç ​​değeri üzerinde rekabet eder, bu da çok iş parçacıklı kodları yavaşlatır. Her iş parçacığına kendi üretecisini vermek ve bu rekabeti ortadan kaldırmak için `java.util.concurrent`'ten `ThreadLocalRandom.current()` kullanın.

Random yapıcısına sabit bir long değeri geçirin, örneğin new Random(42) veya setSeed(42) çağırın. Üretici her çalıştırmada aynı diziyi üretecektir; bu, tekrarlanabilir testler ve simülasyonlar için çok önemlidir.

Şifreler, oturum belirteçleri, tuz değerleri, tek kullanımlık kodlar ve kriptografik anahtarlar gibi değerin tahmine karşı dirençli olması gereken durumlarda SecureRandom kullanın. Düz Rastgele sayı üretimi hızlıdır ancak tahmin edilebilir olduğundan güvenlik çalışmaları için güvenli değildir.

Makine öğrenimi çerçeveleri, ağırlıkları başlatmak, eğitim verilerini karıştırmak ve doğrulama kümelerini bölmek için sözde rastgele sayı üreteçleri kullanır. Bir başlangıç ​​değerini sabitlemek, deneylerin tekrarlanabilir olmasını sağlar, böylece ekipler model çalıştırmalarını karşılaştırabilir ve sonuçlarda güvenilir bir şekilde hata ayıklayabilir.

Evet. GitHub Copilot, aralık ölçeklendirme formülleriyle eşleşen Random, ThreadLocalRandom ve SecureRandom kod parçacıklarını oluşturur ve JUnit testleri. RevSeçilen sınıfın kullanım durumuna uygun olup olmadığını doğrulamak için her öneriyi inceleyin, özellikle güvenlik açısından hassas kodlar için bu önemlidir.

Bu yazıyı şu şekilde özetleyin: