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 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.RandomBu, 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, venextDouble.Math.randomBu, 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.Randomiçten.ThreadLocalRandominjava.util.concurrentHer iş parçacığına kendi jeneratörünü verir, böylece birden fazla iş parçacığı tek bir örnek üzerinde rekabet etmez.SecureRandominjava.securityParolalar, 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.
