Donanımdan Yazılıma: Rastgele Sayı Üretecinin Arkasındaki Sabır Sanatı
Elektronik devrelerime bir şeyler tasarladığımda, her şeyin birbirine bağlanması, bir amaca hizmet etmesi gerekir. Bir girdi, bir süreç geçiriyor ve beklenen bir çıktı üretiyor. Bu döngü, benim için bir nevi yaşam döngüsü. Ancak bazen, bu döngünün kontrollü bir düzensizliğe ihtiyacı oluyor. İşte bu noktada, en başta "kontrolsüz" gibi görünen bir kavram devreye giriyor: Rastgelelik.
Bu seride geçmiş yazılarımda, rastgeleliğin felsefi boyutlarına, tesadüflerin dansına değindim. Teorik olarak mükemmel bir noktaya gelmiş olsaydık, her şey çok kolay olurdu. Gerçek projelerde ise durum böyle değil. Bir mikrodenetleyiciden, Arduino'dan veya bir bilgisayarın işlemcisinden ürettiğimiz o "rastgele" sayı dizisi, çoğu zaman en ince detayda bizi bekleyen sabır sınavımızdır.
Gerçek Rastgelelik Bir Yanılsama mıdır?
Bir öğrenci olarak, benim için en büyük merak konusu her zaman bu mikrodenetleyicilerin sınırları olmuştur. Bir rand() fonksiyonu çağrısıyla elde ettiğimiz sayı gerçekten rastgele midir? Hayır. Birçoğu, belirli bir başlangıç değeri (seed) ile belirlenmiş deterministik bir süreçtir. Bu, bir çeşit kontrollü kaos dediğimiz şey.
Benim üzerinde çalıştığım bir projede, bir sensörden gelen gürültüyü kullanarak yazılımsal bir rastgele sayı üreteci oluşturmaya karar vermiştim. Bu, saf yazılımsal bir çözümden ziyade, fiziksel bir olayı yazılımla birleştirmek üzerine kurulu bir DIY (Kendin Yap) deneyti. Sensörden gelen her bir anlık voltaj dalgalanması, bize o anın fiziksel "gürültü profilini" veriyor. Bu profili dijital bir sayısal değere eşlemek, o gürültüyü bizim için anlamlı bir girdi haline getirmek demek.
Bu süreçte karşılaştığımız en büyük zorluk, veri toplama ve temizleme aşamasıydı. Bir mikrodenetleyicinin ADC (Analogdan Dijitale Dönüştürücü) girişine giren voltaj, sürekli olarak filtreleme ve örnekleme ihtiyacı duyuyor. Eğer bu filtreleme doğru yapılmazsa, aldığımız "gürültü", sadece o anki ortam sıcaklığına ya da güç kaynağındaki küçük bir dalgalanmaya ait olabilir; yani gerçek anlamda rastgele değildir, sadece belgelemediğimiz bir değişkenliktir.
Determinasyonun Ötesine Geçmek
Öyleyse, biz mühendisler olarak neyi hedefliyoruz? Saf bir fiziksel rastgele sayı üreteci (TRNG) tasarlamıyorsak bile, amacımız elimizdeki en büyük entropiyi (düzensizliği) yakalamaktır.
İşte o an geldiğinde, kod satırları birer düşünce değil, birer müdahale aracıdır. Gürültüyü alıyorsun, onu belli bir hızda okuyorsun, dijitalleştiriyorsun ve bu karmaşık, kaotik girdiyi alıp, bizim programımızın anlayacağı, kullanabileceğimiz, örneğin bir sonraki eylem için gerekli olan yeni bir başlangıç değeri haline getiriyorsun. Bu, sanki iki farklı düzlemden gelen bilgileri birleştirip, üçüncü bir, organik gerçeklik yaratmak gibi.
Bu dengeyi kurmak — kontrol edilebilir bir sistemin içine, ölçülebilir bir miktar ölçülemeyen gürültüyü dahil etmek — benim için bilgisayar biliminin en zarif uygulamalarından biri. Bir projeye duyduğum tutku da bu noktada ortaya çıkıyor: O küçük, öngörülemez parçacıkların, büyük bir sistemin davranışını nasıl güzelleştirebildiğini görmek.