11. Arayuzler ve Soyut Siniflar

Java’nin Temelleri

Ismail Kirbas

2026

11. Arayuzler ve Soyut Siniflar

Bölüm 11: Matematiksel Yardimcilar ve Rastgelelik


11.1 Giriş

Yazılım geliştirme sürecinde matematiksel işlemler, günlük programlama pratiğinin vazgeçilmez bir parçasıdır. Bir e-ticaret sitesinde sepetteki ürünlerin toplam fiyatını hesaplamaktan, bir oyun motorunda karakterlerin hareketini simüle etmeye kadar pek çok alanda matematiksel hesaplamalara ihtiyaç duyulur.

Java, geliştiricilere bu hesaplamaları kolaylaştırmak için güçlü araçlar sunar. Bu bölümde, Java’nın Math sınıfı ile temel matematiksel işlemleri, rastgele sayı üretim mekanizmalarını ve karşılaşılan problemleri çözmek için kullanılabilecek yaklaşımları öğreneceksiniz.

💡 Pedagojik Not: Bu bölümde öğreneceğiniz kavramlar, ilerleyen konularda (özellikle oyun geliştirme, simülasyon ve veri analizi) sıkça karşınıza çıkacaktır. Her bir metodu sadece ezberlemek yerine, hangi durumda hangi aracı kullanmanız gerektiğini anlamaya odaklanın.

Gerçek Dünya Uygulamaları

Rastgele sayı üretimi ve matematiksel hesaplamalar şu alanlarda kritik öneme sahiptir:

  • Simülasyon: Hava durumu tahmini, trafik akışı modelleme
  • Oyun Geliştirme: Karakter davranışları, tesadüfi olaylar
  • Kriptografi: Güvenli anahtar üretimi, şifreleme
  • Veri Analizi: İstatistiksel örnekleme, Monte Carlo yöntemleri
  • Yapay Zeka: Rastgele başlangıç değerleri, genetik algoritmalar

Bölüm Hedefleri

Bu bölümü tamamladığınızda: - Math sınıfının temel metotlarını etkin bir şekilde kullanabileceksiniz - Farklı rastgele sayı üretim yöntemlerini karşılaştırabileceksiniz - Matematiksel problemleri Java’da modelleyip çözebileceksiniz - Gerçek hayat problemlerine uygun çözüm stratejileri geliştirebileceksiniz


11.2 Math Sınıfının Temel Metotları ve Kullanımı

Java’nın Math sınıfı, java.lang paketinin bir parçası olduğu için herhangi bir import ifadesine gerek duymadan kullanılabilir. Tüm metotları statik olduğu için, sınıf adı üzerinden doğrudan çağrılabilirler.

// Math sınıfına ihtiyacımız yok - java.lang paketinin parçasıdır
public class MathOrnek {
    public static void main(String[] args) {
        double sayi = Math.abs(-15.7);
        System.out.println("Mutlak değer: " + sayi);
    }
}

⚠️ Önemli Not: Math sınıfının metotları statik olduğu için, Math nesnesi oluşturmanıza gerek yoktur. new Math() ifadesi derleme hatası verecektir çünkü Math sınıfının constructor’ı private’dır.

Temel Aritmetik Metotlar

abs() - Mutlak Değer

Mutlak değer, bir sayının sıfıra olan uzaklığını ifade eder. Pozitif sayılar olduğu gibi kalırken, negatif sayılar pozitife dönüşür.

public class MutlakDegerOrnek {
    public static void main(String[] args) {
        int tamSayi = -42;
        double ondalikli = -3.14;
        
        System.out.println("Tam sayı mutlak: " + Math.abs(tamSayi));      // 42
        System.out.println("Ondalıklı mutlak: " + Math.abs(ondalikli));    // 3.14
        
        // Özel durum: Integer.MIN_VALUE
        System.out.println("MIN_VALUE mutlak: " + Math.abs(Integer.MIN_VALUE));
        // Bu durumda negatif değer döner çünkü 2^31 pozitif gösterilemez
    }
}

max() ve min() - Karşılaştırma

İki değer arasında büyük veya küçük olanı bulmak için kullanılır.

public class KarsilastirmaOrnek {
    public static void main(String[] args) {
        int a = 45, b = 78;
        double x = 3.14, y = 2.71;
        
        System.out.println("En büyük: " + Math.max(a, b));      // 78
        System.out.println("En küçük: " + Math.min(a, b));      // 45
        
        System.out.println("Ondalıklı en büyük: " + Math.max(x, y));  // 3.14
        System.out.println("Ondalıklı en küçük: " + Math.min(x, y));  // 2.71
        
        // Pratik kullanım: bir dizide en büyük değeri bulma
        int[] sayilar = {12, 45, 67, 23, 89, 34, 56};
        int enBuyuk = sayilar[0];
        for (int sayi : sayilar) {
            enBuyuk = Math.max(enBuyuk, sayi);
        }
        System.out.println("Dizideki en büyük: " + enBuyuk);  // 89
    }
}

pow() - Üs Alma

Bir sayının belirli bir kuvvetini hesaplar. double türünde değer döndürür.

public class UsAlmaOrnek {
    public static void main(String[] args) {
        // 2^3 = 8
        System.out.println("2^3 = " + Math.pow(2, 3));
        
        // 5^2 = 25
        System.out.println("5^2 = " + Math.pow(5, 2));
        
        // 10^0 = 1
        System.out.println("10^0 = " + Math.pow(10, 0));
        
        // Karekök için 0.5 üssü
        System.out.println("16^(1/2) = " + Math.pow(16, 0.5));
        
        // Negatif üs
        System.out.println("2^(-3) = " + Math.pow(2, -3));  // 0.125
        
        // Pratik: Bileşik faiz hesaplama
        double anapara = 1000;
        double faizOrani = 0.05;
        int yil = 3;
        double toplam = anapara * Math.pow(1 + faizOrani, yil);
        System.out.printf("3 yıl sonraki toplam: %.2f TL%n", toplam);
    }
}

sqrt() - Karekök

Bir sayının karekökünü hesaplar. Negatif sayılar için NaN (Not a Number) döndürür.

public class KarekokOrnek {
    public static void main(String[] args) {
        System.out.println("25'in karekökü: " + Math.sqrt(25));      // 5.0
        System.out.println("2'nin karekökü: " + Math.sqrt(2));       // 1.414...
        System.out.println("0'ın karekökü: " + Math.sqrt(0));        // 0.0
        System.out.println("-4'ün karekökü: " + Math.sqrt(-4));      // NaN
        
        // Pratik: Pisagor teoremi
        double kenarA = 3;
        double kenarB = 4;
        double hipotenus = Math.sqrt(Math.pow(kenarA, 2) + Math.pow(kenarB, 2));
        System.out.println("Hipotenüs: " + hipotenus);  // 5.0
    }
}

Yuvarlama Metotları

Ondalıklı sayıları farklı şekillerde yuvarlamak için kullanılan metotlardır.

ceil() - Yukarı Yuvarlama

Sayıyı her zaman bir üst tamsayıya yuvarlar. Pozitif sayılarda olduğu gibi negatif sayılarda da “yukarı” kavramı matematiksel anlamda kullanılır.

public class CeilOrnek {
    public static void main(String[] args) {
        System.out.println("3.2'nin tavanı: " + Math.ceil(3.2));      // 4.0
        System.out.println("3.8'in tavanı: " + Math.ceil(3.8));       // 4.0
        System.out.println("-3.2'nin tavanı: " + Math.ceil(-3.2));    // -3.0
        System.out.println("-3.8'in tavanı: " + Math.ceil(-3.8));     // -3.0
        System.out.println("5.0'ın tavanı: " + Math.ceil(5.0));       // 5.0
        
        // Pratik: Bir sınavda geçme notu hesaplama
        double puan = 67.3;
        double yuvarlanmisPuan = Math.ceil(puan);
        System.out.println("Yuvarlanmış puan: " + yuvarlanmisPuan);  // 68.0
    }
}

floor() - Aşağı Yuvarlama

Sayıyı her zaman bir alt tamsayıya yuvarlar.

public class FloorOrnek {
    public static void main(String[] args) {
        System.out.println("3.2'nin tabanı: " + Math.floor(3.2));     // 3.0
        System.out.println("3.8'in tabanı: " + Math.floor(3.8));      // 3.0
        System.out.println("-3.2'nin tabanı: " + Math.floor(-3.2));   // -4.0
        System.out.println("-3.8'in tabanı: " + Math.floor(-3.8));    // -4.0
        System.out.println("5.0'ın tabanı: " + Math.floor(5.0));      // 5.0
        
        // Pratik: KDV hesaplama
        double fiyat = 99.99;
        double kdvOrani = 0.18;
        double kdvliFiyat = fiyat * (1 + kdvOrani);
        double yuvarlanmisFiyat = Math.floor(kdvliFiyat * 100) / 100;
        System.out.println("KDV'li fiyat: " + yuvarlanmisFiyat);
    }
}

round() - En Yakın Tamsayıya Yuvarlama

Matematiksel yuvarlama kurallarına göre en yakın tamsayıya yuvarlar. .5 ve üzeri yukarı, altı aşağı yuvarlanır.

public class RoundOrnek {
    public static void main(String[] args) {
        System.out.println("3.2'nin yuvarlanmışı: " + Math.round(3.2));     // 3
        System.out.println("3.5'in yuvarlanmışı: " + Math.round(3.5));      // 4
        System.out.println("3.8'in yuvarlanmışı: " + Math.round(3.8));      // 4
        System.out.println("-3.2'nin yuvarlanmışı: " + Math.round(-3.2));   // -3
        System.out.println("-3.5'in yuvarlanmışı: " + Math.round(-3.5));    // -3
        System.out.println("-3.8'in yuvarlanmışı: " + Math.round(-3.8));    // -4
        
        // Not: round() float için int, double için long döndürür
        float f = 3.7f;
        double d = 3.7;
        System.out.println("float round: " + Math.round(f));   // 4 (int)
        System.out.println("double round: " + Math.round(d));  // 4 (long)
    }
}

📝 Önemli: round() metodu, float parametre için int, double parametre için long döndürür. Bu, büyük sayılarla çalışırken taşma riskini önlemek içindir.

Trigonometrik ve Logaritmik Metotlar

Bu metotlar, bilimsel ve mühendislik hesaplamalarında sıkça kullanılır.

Trigonometrik Metotlar

Math sınıfı, standart trigonometrik fonksiyonları sağlar. Tüm trigonometrik metotlar radyan cinsinden açı değerleri alır.

public class TrigonometriOrnek {
    public static void main(String[] args) {
        double aciDerece = 45;
        double aciRadyan = Math.toRadians(aciDerece);
        
        System.out.println("45° = " + aciRadyan + " radyan");
        System.out.println("Sin 45°: " + Math.sin(aciRadyan));
        System.out.println("Cos 45°: " + Math.cos(aciRadyan));
        System.out.println("Tan 45°: " + Math.tan(aciRadyan));
        
        // Ters trigonometrik fonksiyonlar
        double sinDeger = 0.5;
        double aci = Math.asin(sinDeger);
        System.out.println("Arcsin(0.5) = " + Math.toDegrees(aci) + "°");
        
        // Pratik: Dairenin alanı
        double yaricap = 5;
        double alan = Math.PI * Math.pow(yaricap, 2);
        System.out.println("Daire alanı: " + alan);
    }
}

Logaritmik Metotlar

Doğal logaritma ve 10 tabanında logaritma hesaplamaları için kullanılır.

public class LogaritmaOrnek {
    public static void main(String[] args) {
        System.out.println("ln(e): " + Math.log(Math.E));           // 1.0
        System.out.println("ln(10): " + Math.log(10));              // 2.302...
        System.out.println("log10(100): " + Math.log10(100));       // 2.0
        System.out.println("log10(1000): " + Math.log10(1000));     // 3.0
        
        // Pratik: Bir sayının kaç basamaklı olduğunu bulma
        int sayi = 12345;
        int basamakSayisi = (int)Math.log10(sayi) + 1;
        System.out.println(sayi + " sayısı " + basamakSayisi + " basamaklı");
    }
}
// Dosya: MathTemelMetotlar.java
public class MathTemelMetotlar {
    public static void main(String[] args) {
        // Demo: Temel matematiksel işlemler
        double sayi = -5.7;
        System.out.println("=== TEMEL METOTLAR ===");
        System.out.println("Sayı: " + sayi);
        System.out.println("Mutlak değer: " + Math.abs(sayi));
        System.out.println("Yukarı yuvarla: " + Math.ceil(sayi));
        System.out.println("Aşağı yuvarla: " + Math.floor(sayi));
        System.out.println("En yakın: " + Math.round(sayi));
        System.out.println("2^3 = " + Math.pow(2, 3));
        System.out.println("25'in karekökü = " + Math.sqrt(25));
        
        // Karşılaştırma
        System.out.println("\n=== KARŞILAŞTIRMA ===");
        System.out.println("max(10, 20): " + Math.max(10, 20));
        System.out.println("min(10, 20): " + Math.min(10, 20));
        
        // Matematiksel sabitler
        System.out.println("\n=== SABİTLER ===");
        System.out.println("PI: " + Math.PI);
        System.out.println("E: " + Math.E);
    }
}
// Dosya: TrigonometriSabitler.java
public class TrigonometriSabitler {
    public static void main(String[] args) {
        System.out.println("=== TRİGONOMETRİK İŞLEMLER ===");
        double aci = 45;
        double radyan = Math.toRadians(aci);
        System.out.println("Pi sayısı: " + Math.PI);
        System.out.println("Sin 45°: " + Math.sin(radyan));
        System.out.println("Cos 45°: " + Math.cos(radyan));
        System.out.println("Tan 45°: " + Math.tan(radyan));
        
        // Ters trigonometrik
        System.out.println("\n=== TERS TRİGONOMETRİK ===");
        System.out.println("Arcsin(1): " + Math.toDegrees(Math.asin(1)) + "°");
        System.out.println("Arccos(0): " + Math.toDegrees(Math.acos(0)) + "°");
        System.out.println("Arctan(1): " + Math.toDegrees(Math.atan(1)) + "°");
        
        // Hiperbolik
        System.out.println("\n=== HİPERBOLİK ===");
        System.out.println("Sinh(1): " + Math.sinh(1));
        System.out.println("Cosh(1): " + Math.cosh(1));
        System.out.println("Tanh(1): " + Math.tanh(1));
    }
}

11.3 Rastgele Sayı Üretimi Temelleri

Rastgele sayı üretimi, birçok uygulamada kritik bir role sahiptir. Java, farklı ihtiyaçlara yönelik çeşitli rastgele sayı üretim mekanizmaları sunar.

Math.random() Metodu

Math.random() metodu, 0.0 (dahil) ile 1.0 (hariç) arasında rastgele bir double değer üretir.

public class MathRandomTemel {
    public static void main(String[] args) {
        // Temel kullanım
        double rastgele = Math.random();
        System.out.println("0-1 arası rastgele: " + rastgele);
        
        // Belirli aralıkta sayı üretme formülü:
        // (int)(Math.random() * (max - min + 1)) + min
        
        // 1-10 arası tamsayı
        int birOn = (int)(Math.random() * 10) + 1;
        System.out.println("1-10 arası: " + birOn);
        
        // 50-100 arası tamsayı
        int elliYuz = (int)(Math.random() * 51) + 50;
        System.out.println("50-100 arası: " + elliYuz);
        
        // 0-100 arası çift sayı
        int ciftSayi = (int)(Math.random() * 51) * 2;
        System.out.println("0-100 arası çift: " + ciftSayi);
    }
}

💡 İpucu: Math.random() ile belirli bir aralıkta sayı üretirken formülü şöyle hatırlayın: (int)(Math.random() * aralikGenisligi) + baslangicDegeri

Random Sınıfı

Random sınıfı, Math.random()’a göre daha esnek ve zengin bir API sunar. Farklı veri türlerinde rastgele değerler üretebilir.

import java.util.Random;

public class RandomSinifiOrnek {
    public static void main(String[] args) {
        Random rastgele = new Random();
        
        // Farklı türlerde rastgele değerler
        System.out.println("Rastgele tamsayı: " + rastgele.nextInt());
        System.out.println("0-100 arası: " + rastgele.nextInt(101));
        System.out.println("Rastgele ondalık: " + rastgele.nextDouble());
        System.out.println("Rastgele boolean: " + rastgele.nextBoolean());
        System.out.println("Rastgele float: " + rastgele.nextFloat());
        System.out.println("Rastgele long: " + rastgele.nextLong());
        
        // Belirli aralıkta sayı üretme
        int min = 10, max = 20;
        int aralik = rastgele.nextInt(max - min + 1) + min;
        System.out.println(min + "-" + max + " arası: " + aralik);
    }
}

Seed Kavramı ve Deterministik Rastgelelik

Seed (tohum değeri), rastgele sayı üretecinin başlangıç durumunu belirler. Aynı seed ile başlatılan üreteçler, her zaman aynı sayı dizisini üretir.

import java.util.Random;

public class SeedOrnek {
    public static void main(String[] args) {
        // Aynı seed ile aynı sayılar üretilir
        Random r1 = new Random(42);
        Random r2 = new Random(42);
        
        System.out.println("=== AYNI SEED ===");
        System.out.println("r1: " + r1.nextInt(100));
        System.out.println("r2: " + r2.nextInt(100));  // Aynı sayı
        System.out.println("r1: " + r1.nextInt(100));
        System.out.println("r2: " + r2.nextInt(100));  // Aynı sayı
        
        // Farklı seed ile farklı sayılar
        Random r3 = new Random(100);
        System.out.println("\n=== FARKLI SEED ===");
        System.out.println("r3: " + r3.nextInt(100));
        
        // Seed kullanım alanları:
        // 1. Testlerde tekrarlanabilirlik
        // 2. Oyunlarda harita oluşturma
        // 3. Bilimsel simülasyonlar
    }
}

ThreadLocalRandom Sınıfı

Çoklu iş parçacığı (multi-thread) ortamlarında performanslı rastgele sayı üretimi için kullanılır.

import java.util.concurrent.ThreadLocalRandom;

public class ThreadLocalRandomOrnek {
    public static void main(String[] args) {
        // Thread-safe rastgele sayı üretimi
        int sayi = ThreadLocalRandom.current().nextInt(1, 101);
        System.out.println("Thread-safe rastgele: " + sayi);
        
        // Belirli aralıkta sayı
        double ondalik = ThreadLocalRandom.current().nextDouble(0.0, 1.0);
        System.out.println("0-1 arası thread-safe: " + ondalik);
        
        // Performans karşılaştırması (tek thread'de bile avantajlı)
        long baslangic = System.nanoTime();
        for (int i = 0; i < 1000000; i++) {
            ThreadLocalRandom.current().nextInt();
        }
        long sure = System.nanoTime() - baslangic;
        System.out.println("ThreadLocalRandom süresi: " + sure + " ns");
    }
}
// Dosya: RastgeleSayiTemel.java
public class RastgeleSayiTemel {
    public static void main(String[] args) {
        System.out.println("=== Math.random() KULLANIMI ===");
        System.out.println("0-1 arası rastgele: " + Math.random());
        System.out.println("1-10 arası rastgele tamsayı: " + 
            (int)(Math.random() * 10 + 1));
        System.out.println("50-100 arası rastgele tamsayı: " + 
            (int)(Math.random() * 51 + 50));
        
        // Birden fazla rastgele sayı
        System.out.println("\n5 adet rastgele sayı (1-100):");
        for (int i = 0; i < 5; i++) {
            System.out.print((int)(Math.random() * 100 + 1) + " ");
        }
        System.out.println();
        
        // Rastgele boolean (0.5 olasılıkla)
        boolean yaziMi = Math.random() < 0.5;
        System.out.println("Yazı mı? " + (yaziMi ? "Evet" : "Hayır"));
    }
}
// Dosya: RandomSinifiKullanim.java
import java.util.Random;

public class RandomSinifiKullanim {
    public static void main(String[] args) {
        Random rastgele = new Random();
        
        System.out.println("=== Random SINIFI ===");
        System.out.println("Rastgele tamsayı: " + rastgele.nextInt());
        System.out.println("0-100 arası: " + rastgele.nextInt(101));
        System.out.println("Rastgele ondalık: " + rastgele.nextDouble());
        System.out.println("Rastgele boolean: " + rastgele.nextBoolean());
        
        // Rastgele dizi oluşturma
        int[] dizi = new int[10];
        for (int i = 0; i < dizi.length; i++) {
            dizi[i] = rastgele.nextInt(100);
        }
        System.out.print("Rastgele dizi: ");
        for (int sayi : dizi) {
            System.out.print(sayi + " ");
        }
        System.out.println();
        
        // Rastgele renk üretme (RGB)
        int kirmizi = rastgele.nextInt(256);
        int yesil = rastgele.nextInt(256);
        int mavi = rastgele.nextInt(256);
        System.out.printf("Rastgele renk: RGB(%d, %d, %d)%n", kirmizi, yesil, mavi);
    }
}

11.4 Rastgele Sayı Üretiminde İleri Teknikler

Gaussian (Normal) Dağılım

Normal dağılım, doğada sıkça karşılaşılan bir olasılık dağılımıdır. nextGaussian() metodu, ortalaması 0 ve standart sapması 1 olan normal dağılımdan rastgele değerler üretir.

import java.util.Random;

public class GaussianOrnek {
    public static void main(String[] args) {
        Random rastgele = new Random();
        
        // Normal dağılım (ortalama=0, std=1)
        System.out.println("Normal dağılım örnekleri:");
        for (int i = 0; i < 10; i++) {
            double gaussian = rastgele.nextGaussian();
            System.out.printf("%.3f ", gaussian);
        }
        System.out.println();
        
        // Belirli ortalama ve standart sapma için dönüşüm
        double ortalama = 75.0;  // Sınav notu ortalaması
        double stdSapma = 10.0;  // Standart sapma
        
        System.out.println("\nSınav notu simülasyonu (ort=75, std=10):");
        for (int i = 0; i < 5; i++) {
            double not = ortalama + stdSapma * rastgele.nextGaussian();
            // Notu 0-100 arasında sınırla
            not = Math.max(0, Math.min(100, not));
            System.out.printf("%.1f ", not);
        }
        System.out.println();
    }
}

SecureRandom Sınıfı

Kriptografik olarak güvenli rastgele sayı üretimi için kullanılır. Şifreleme anahtarları, token’lar ve güvenlik sertifikaları gibi hassas uygulamalarda tercih edilir.

import java.security.SecureRandom;

public class SecureRandomOrnek {
    public static void main(String[] args) {
        SecureRandom guvenli = new SecureRandom();
        
        System.out.println("=== GÜVENLİ RASTGELE SAYILAR ===");
        System.out.println("Güvenli tamsayı: " + guvenli.nextInt());
        System.out.println("0-100 arası güvenli: " + guvenli.nextInt(100));
        
        // Rastgele byte dizisi
        byte[] rastgeleBytes = new byte[16];
        guvenli.nextBytes(rastgeleBytes);
        System.out.print("Rastgele byte dizisi: ");
        for (byte b : rastgeleBytes) {
            System.out.printf("%02X ", b);
        }
        System.out.println();
        
        // Güvenli şifre oluşturma
        String sifre = guvenliSifreUret(12);
        System.out.println("Güvenli şifre: " + sifre);
    }
    
    public static String guvenliSifreUret(int uzunluk) {
        SecureRandom rastgele = new SecureRandom();
        String karakterler = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
                           "abcdefghijklmnopqrstuvwxyz" +
                           "0123456789!@#$%^&*()_+-=[]{}|;:,.<>?";
        StringBuilder sifre = new StringBuilder();
        
        for (int i = 0; i < uzunluk; i++) {
            int index = rastgele.nextInt(karakterler.length());
            sifre.append(karakterler.charAt(index));
        }
        
        return sifre.toString();
    }
}

Rastgele Karakter ve Dizi Üretimi

Rastgele karakter dizileri, şifre oluşturma, test verisi hazırlama ve oyun geliştirme gibi alanlarda kullanılır.

import java.util.Random;

public class RastgeleKarakterOrnek {
    public static void main(String[] args) {
        Random rastgele = new Random();
        
        // Rastgele büyük harf
        char buyukHarf = (char)('A' + rastgele.nextInt(26));
        System.out.println("Rastgele büyük harf: " + buyukHarf);
        
        // Rastgele küçük harf
        char kucukHarf = (char)('a' + rastgele.nextInt(26));
        System.out.println("Rastgele küçük harf: " + kucukHarf);
        
        // Rastgele rakam
        char rakam = (char)('0' + rastgele.nextInt(10));
        System.out.println("Rastgele rakam: " + rakam);
        
        // Rastgele string oluşturma
        String rastgeleString = rastgeleStringUret(8);
        System.out.println("Rastgele string: " + rastgeleString);
        
        // Rastgele isim oluşturma (basit)
        String[] isimler = {"Ali", "Ayşe", "Mehmet", "Zeynep", "Ahmet"};
        String[] soyisimler = {"Yılmaz", "Demir", "Çelik", "Kaya", "Öztürk"};
        String tamIsim = isimler[rastgele.nextInt(isimler.length)] + " " + 
                        soyisimler[rastgele.nextInt(soyisimler.length)];
        System.out.println("Rastgele isim: " + tamIsim);
    }
    
    public static String rastgeleStringUret(int uzunluk) {
        Random rastgele = new Random();
        String karakterler = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        StringBuilder sb = new StringBuilder();
        
        for (int i = 0; i < uzunluk; i++) {
            int index = rastgele.nextInt(karakterler.length());
            sb.append(karakterler.charAt(index));
        }
        
        return sb.toString();
    }
}

Performans Optimizasyonu

Rastgele sayı üretiminde performans, özellikle büyük ölçekli simülasyonlarda önemli bir faktördür.

```java import java.util.Random; import java.util.concurrent.ThreadLocalRandom;

public class PerformansKarsilastirma { public static void main(String[] args) { int iterasyon = 10_000_000;

    // Math.random() performansı
    long baslangic = System.nanoTime();
    for (int i = 0; i < iterasyon; i++) {
        Math.random();
    }
    long mathSure = System.nanoTime() - baslangic;
    System.out.println("Math.random(): " + mathSure / 1_000_000 + " ms");

    // Random sınıfı performansı
    Random rastgele = new Random();
    baslangic = System.nanoTime();
    for (int i = 0; i < iterasyon; i++) {
        rastgele.nextDouble();
    }
    long randomSure = System.nanoTime() - baslangic;
    System.out.println("Random sınıfı: " + randomSure / 1_000_000 + " ms");

    // ThreadLocalRandom performansı
    baslangic = System.nanoTime();
    for (int i = 0; i < iterasyon; i++) {
        ThreadLocalRandom.current().nextDouble();
    }
    long threadSure = System.nanoTime() - baslangic;
    System.out.println("ThreadLocalRandom: