Sıfırıncı Durum: Donanım ve Yazılımın Derinliklerinde

Determinizmden Kurtulmak: Saf Rastgele Sayı Üretimine Giriş (ve Neden Gerçekten Zor Olduğu)

Merhaba sevgili okurlar. Bu köşede her zaman olduğu gibi fiziksel dünyadaki belirsizliklerle, soyut matematiksel modellerle kesişen noktaları arıyoruz. Bu serideki önceki yazılarımızda rastgeleliği bir fenomeni, bir dansı ya da yapılandırılması gereken bir girdiyi incelemiştik. Şimdi ise en temel soruya iniyorum: Bilgisayarımız, gerçekten "rastgele" bir şey üretebiliyor mu? Ve eğer üretiyorsa, bunu nasıl başarıyor?

Birçok kişi için bilgisayarın üretmesi yeterlidir. Bir rand() fonksiyonu çağırılır, bir sayının görece rastgele gelmesi beklenir. Ancak benim için bu, tıpkı kusurlu bir ölçüm aletinden çıkan veriyi kabul etmek gibidir. Her şeyin altında yatan mekanizmayı anlamak zorundayız; özellikle de o mekanizma deterministikse.

Pseudorandomness vs. True Randomness: Kavramsal Ayrım

Bir işlemcinin çıktısını alıyorsak, o işlemci belirli bir başlangıç durumuyla (seed) çalıştırıldığında aynı girdiyi her zaman verecektir. Bu, onu deterministik yapar. Bir bilgisayarın ürettiği her şey bu kategoriye girer; bunlar ise sözde rastgele sayılardır (PRNG).

Bir PRNG, başlangıç noktasını doğru seçtiğiniz sürece, sonraki sayı dizilerini öngörülebilir bir matematiksel fonksiyondan geçirerek üretir. Bir Fibonacci dizisi gibi düşünebilirsiniz; başlangıçta iki sayıyı verirseniz, gerisi bellidir. Bilgisayar algoritmaları da böyledir, sadece geçiş fonksiyonları çok karmaşıktır.

İyi Bir PRNG'nin Anatomisi: LCG örneği

Eğer gerçekten basit bir örnek üzerinden geçmek istiyorsak, Lineer Kongrüansiyel Üreteçler (LCG) iyi bir örnektir. Bu, en basit ve en hızlı PRNG mekanizmalarından biridir. Temel denklem şöyledir:

$$X_{n+1} = (a \cdot X_n + c) \pmod{m}$$

Burada $X_n$, mevcut rastgele sayıdır; $a, c,$ ve $m$ ise tamamen sizin seçtiğiniz sabitlerdir (modül). Başlangıç sayınız ($X_0$) ve bu üç parametre belirlendikten sonra, mekanizma devreye girer.

Örneğin, bir Arduino üzerinde basitçe bu denklemi kullanırsanız, elde ettiğiniz sayılar öngörülebilir olacaktır. Bu, oyun geliştirmede basit bir varyasyon için kullanılabilir ancak kriptografik güvenlik gerektiren hiçbir yerde bu kadarınına güvenmemeliyiz. Benim için bu, bir bisikletin pedala basılarak hareket ettirilmesi gibi; girdi vardır, çıktı bellidir.

Gerçek Rastgeleliğe Nasıl Dokunulur? (TRNG)

İşte benim elektronik mühendisliği tutkum devreye giriyor. Eğer determinizmden kurtulup gerçekten öngörülemez bir girdi istiyorsak, donanımın entropiyi yakalaması gerekir. Buna Gerçek Rastgele Sayı Üretimi (TRNG) diyoruz.

Bir TRNG, fiziksel dünyadaki kaostan beslenir. Mikrodenetleyicinin içindeki bir sayaç değil, dışarıdaki fiziksel olaylar girdi sağlar:

  1. Termal Gürültü: Bir direnç üzerinden akan termal elektronların rastgele çarpışmaları.
  2. Zamanlama Farklılıkları: Bir olayın (örneğin, bir butonun basılı tutulma süresi) dijital alıcıya ulaşmadaki mikroskobik zamanlama hataları.
  3. Radyo Frekans Gürültüsü: Ortamdaki istenmeyen ve öngörülemez sinyaller.

Bu gürültüyü okumak, genellikle bir ADC (Analog-Dijital Dönüştürücü) kullanarak analog sinyali dijitale çevirip, bu sayının kendi içinde bir belirsizlik barındırmasına izin vermekle başlar. Bu, teorik olarak mükemmel bir başlangıç entropisidir.

Sonuç olarak; yazılımda iyi bir PRNG bulmak ucuz ve hızlıdır. Ancak sistemin sınırlarını zorlamak, bizi mutlaka donanımın doğasına, yani kaçınılmaz olan öngörülemezliğe ulaşmaya iter. Sizin en son entropinizi nereden aldığınızı merak ediyorum.


(Burak Ege)