Mikrodenetleyicilerle Rastgele Sayı Üretimi: Saf Donanımdan Yazılıma Yolculuk
Üniversite yıllarımın en heyecan verici dönemiydi sanırım. Teorik fizik derslerinde karşılaştığımız entropi kavramı, benim gibi donanımdan beslenen biri için sadece bir matematiksel model olmaktan öte, somut bir problem haline geldi. Bir mikrodenetleyiciden gerçekten "rastgele" bir çıktı almak istiyorum. Ama bilgisayarın rand() fonksiyonuyla üretilenlar, doğası gereği deterministik basit doğrusal kongruensiyel jeneratörler (LCG) kullanıyor. Bu, özellikle derinlemesine bir gömülü sistem tasarımcısı için tatmin edici değil.
Bu yazıda, basit bir süreçten başlayarak, mikrodenetleyicimizin fiziksel sınırlarını zorlayarak nasıl daha entropik girdiler elde edebileceğimizi inceleyeceğiz. Eğer sadece bir simülasyonda değil, gerçek bir donanım üzerinde bu olasılığı yakalamak istiyorsak, elimizdeki kaynaklar sınırlı.
Gerçek Rastgeleliğe Yaklaşım: Fiziksel Olmayan Kaynakları Kullanmak
Bir mikrodenetleyiciden bağımsız olarak "gerçek" rastgele sayı üretmek istiyorsak, fiziksel bir süreçten girdi almalıyız. Arduino'da veya Raspberry Pi gibi geliştirme kartlarında bu girişi sağlamanın birkaç yolu var, ancak en temel ve mikrodenetleyiciye en yakın olanı sensör verilerini kullanmaktır.
Bizim örneğimizde, basitlik adına bir analog okuyucu üzerinden sıcaklık sensöründen gelen gürültü varyasyonlarını kullanmayı düşünebiliriz. Ancak bunu daha temiz bir seviyede tutmak adına, kesintiye uğramış zamanlamalar üzerinden basit bir yapı kuralım.
LCG'yi Gürültüyle Beslemek:
Eğer sadece yazılımsal bir çözüme bağımlı kalacaksak bile, LCG'yi uygularken girdi parametrelerini bilinçli olarak "gürültüye" maruz bırakarak çıktının öngörülebilirliğini azaltabiliriz.
Adımlarımız şu şekilde ilerleyecek:
- LCG Temelini Kurmak: Öncelikle,
X_{n+1} = (a X_n + c) \pmod mformülünü mikrodenetleyicinin uygun veri tipine (örneğin, 32-bit unsigned integer) adapte ediyoruz. Bu bizim temel motorumuz olacak. - Tohumlama (Seeding): Burası kritik nokta. Eğer her seferinde aynı başlangıç değeriyle (
X_0) başlıyorsak, elde edeceğimiz seri mükemmel bir kopyadır. Bu başlangıç değerini, o anki ortamdan gelen ölçülebilir ancak düşük frekanslı bir değişime dayandırmalıyız. Örneğin, üzerindeki potansiyometrenin ilk birkaç okuması veya ADC'nin en son kararsız olduğu anın yüksek/düşük biti. - Çıkış Filtrelemesi: Elde edilen ham sayılar, eğer yeterince entropik değilse, bir sonraki adım olan çıkarımla zenginleştirme aşamasına geçmeli.
Bu bağlamda, basit bir mikrodenetleyici üzerinde gerçek bir entropi kaynağı bulmak zordur. Bu yüzden, mevcut donanımın sınırlılıklarını kabul edip, yazılımsal olarak en iyi dağılımı sağlayan bir algoritma seçip, onu mümkün olduğunca farklı başlangıç koşullarıyla beslemeye odaklandım.
Eğer amacınız fiziksel bir kaos yaratmaksa, bir piezo sensörden gelen titreşim frekansını sayarak veya süperkondansatörün deşarj hızındaki ufak varyasyonları okuyarak tahılını bulmanız gerekir. Bu, mikrodenetleyicinin sınırlarını zorlayan harika bir PHY layer projesidir.
Ancak, projelerimizi önce mantıkla ayağa kaldırıyoruz. LCG'nin parametrelerini (a, c, m) seçerken, döngü süresinin bizim uygulamanın çalışma ömrünü aşacağından emin olmak gerekir. Bu matematiksel bir taahhüttür ve bu kararın doğruluğu, elde edeceğimiz "rastgeleliğin" kalitesini belirler.
Bir sonraki yazıda, bu LCG'yi optimize edilmiş bir Python scripti ile simüle edeceğiz ve başlangıç parametrelerimizin sonuç üzerindeki etkisini detaylıca inceleyeceğiz. Donanım tarafında ise, bu matematiksel modeli gerçek gürültü girdileriyle besleme stratejisini tartışacağız. Sabırla, her iki dünyanın da avantajlarını birleştirebiliriz.